Как удвоить массив в JavaScript

1656578779 kak udvoit massiv v javascript

Джейн Филлипс

lybVHEvdOngyvv9jxVef69GZtrv8rRh8baBI
Фото Павана Трикутама на Unsplash

Технические экраны телефонов являются важным шагом в процессе технического собеседования. Часто от того, прошли ли вы технический экран телефона, зависит, пригласят ли вас на собеседование на месте.

Технические экраны телефона могут быть трудными, потому что вы должны думать вслух, решая проблему, не имея преимущества быть там лично со своим интервьюером. Когда вы берете интервью с кем-то по телефону или видео, вам может быть трудно раскрыть все ваше присутствие. Обычно вы работаете в совместном редакторе, поэтому при решении проблемы интервьюер сможет только услышать и увидеть, что вы вводите. Многим людям труднее общаться таким образом, чем лично.

Хорошая новость состоит в том, что технические экраны телефонов – это то, что вы можете практиковать и усовершенствоваться. Как и хоть какой навык, чем больше вы их делаете, тем лучше вы получите. Впоследствии вы начнете видеть результаты, поскольку вас будут приглашать на собеседование со все большим количеством компаний.

Хотя все технические телефонные интервью отличаются, большинство из них потребуют от вас думать на ногах. Поэтому лучший способ подготовиться – просто потренироваться в работе с вопросами. Вы можете пройти через них самостоятельно, обсуждая их, а также потренироваться с другом. Если вы тренируетесь самостоятельно, вы даже можете записать себя, чтобы прослушать запись и увидеть, имеет ли смысл, как вы объяснили свой процесс мышления.

Наконец, вы можете попрактиковаться, беря интервью в компании! Когда я последний раз проходил собеседование на новую роль, я начал с поиска интересующих меня компаний, но не расстраивался бы, если бы не прошел технический экран телефона. Таким образом, я все еще чувствовал давление, чтобы подготовиться, но я ожидал, что сначала испытываю неудачу несколько раз. Тогда было меньшее разочарование, когда я не перешел к следующему этапу.

В этой публикации я расскажу вопрос, который я получил на экране технического телефона, чтобы дать вам основу для подхода к таким типам интервью. Надеюсь, это будет полезно, и я приветствую ваши комментарии и отзывы!

Давайте окунуться.

Вопрос

Это был актуальный вопрос, который я получил от интервьюера. Мне нравится этот вопрос, потому что есть несколько способов его разрешения. То, как вы его решаете, отражает стиль программирования и помогает интервьюеру определить, подходите ли вы на эту должность.

Вот образец вопроса на собеседовании:

Given an array, write a function that doubles the array.Example: given [1,2,3,4,5], your function should return [1,2,3,4,5,1,2,3,4,5].You could call it like so: myArray.double().

Отвечая на вопрос

Вот мои пять шагов для решения проблемы во время технического экрана телефона:

1. Уточните вопросы

2. Подумайте о небольших тестовых случаях, включая крайние случаи

3. Псевдокодируйте свое решение (необязательно)

4. Переведите свой псевдокод в фактический код

5. Проверьте свое решение с помощью тестовых случаев, которые вы придумали раньше

1. Уточните вопросы

Первое, что вы должны сделать, когда задаете такой вопрос на собеседовании, это задать уточняющие вопросы.

В этом случае вопрос относительно простой: я понимаю, что мне нужно написать функцию, которая принимает массив и возвращает массив, которым манипулировали. Понимание ввода и вывода функции приводит к тому, что часто считается сигнатурой функции.

2. Подумайте о небольших тестовых случаях, включая крайние случаи

Далее вы захотите подумать о нескольких примерах, которые позже послужат вашими тестовыми примерами:

// What happens when the given array is empty?[] => []
// What happens when the given array has only 1 element?[1] => [1,1]
// What happens when the given array has only 2 elements?[1,2] => [1,2,1,2]
// What happens when the given array has N elements?[1...N] => [1,2,3,4,5...N,1,2,3,4,5...N]

Если вы подумаете об этих случаях прежде, чем вы начнете кодировать, это поможет вам искать и установить закономерности для того, что вы пытаетесь решить. Это также поможет вам подумать о сложности пространства или времени, что может стать дополнительным вопросом позже. Это также помогает убедиться, что вы достаточно поняли вопрос, поскольку дает интервьюеру возможность исправить любые ошибки.

3. Псевдокодируйте свое решение (необязательно)

Теперь, когда вы прояснили проблему и подумали о нескольких образцах тестовых случаев, пора подумать о действительном решении. Здесь может пригодиться псевдокодирование. Если вы не знакомы с псевдокодированием, это идея написать то, что вы хотите сделать простым языком или упрощенным синтаксисом кода, прежде чем писать рабочий код. Это способ помочь вам упорядочить свои мысли, прежде чем переходить непосредственно к коду.

Псевдокодирование может быть невероятно эффективным с точки зрения помощи, вам оставаться в курсе во время собеседования. Мне лично нравится это делать, потому что это помогает мне оставаться организованным. Если я когда-нибудь застряну, я могу вернуться к шагам, которые я написал в псевдокоде, чтобы вернуться на верный путь.

Однажды у меня было телефонное интервью, где я написал шаги в псевдокоде, прежде чем писать фактический код. Интервьюер смог помочь мне сориентироваться, указав на шаг в моем псевдокоде, который мне нужно было сделать дальше. В этом случае интервьюер также отметил, что никогда раньше не видел, чтобы кто-то так поступал, и был невероятно поражен. Таким образом, псевдокодирование также имеет преимущества, чтобы показать интервьюеру, что вы организованы, и поразить его этими навыками!

Итак, возвращаясь к рассматриваемому вопросу, вот некоторый псевдокод, который вы можете написать:

// Define a function that takes in an array// Loop over the array// Push each element from the array back into the array// Return the array

4. Переведите свой псевдокод в фактический код

Теперь, когда вы написали псевдокод, пора немного кодировать. Для этого вопроса первое (неправильное) решение, которое я придумал, выглядело так:

var array = [1,2,3,4,5];
var double = function(array) {
  for (var i = 0; i < array.length; i++) {    array.push(array[i]);  }
  return array;
}
double(array);

Теперь это выглядит довольно просто, не правда ли? Однако в этом вопросе есть небольшая хитрость, которую я обнаружил, только закодировав свое решение и попытавшись его запустить. Это подводит меня к последнему шагу!

5. Проверьте свое решение с помощью тестовых случаев, которые вы придумали раньше

Если вы опытный программист, вы можете легко заметить ошибку в моем решении выше. Но только когда я запустил свой код, я понял, что создал ужасающий бесконечный цикл!

Почему это создает нескончаемый цикл? The array.length что я использовал, чтобы знать, когда мой for loop would stop динамически увеличивался, поскольку я вставлял новые элементы в массив! Итак, когда for цикл начался, array.length равнялась 5. Но после первой итерации for петля, array.length равнялась 6, и до бесконечности.

Однако есть простое изменение, которое заставит это решение работать:

var array = [1,2,3,4,5];
var double = function(array) {
  var length = array.length;
  for (var i = 0; i < length; i++) {    array.push(array[i]);  }
  return array;
}
double(array);=> [1,2,3,4,5,1,2,3,4,5]

ВРЕМЯ исполнения: O(n) = линейный

С этим изменением я объявляю переменную под названием length внутри области действия функции, а затем использовать это как разделитель для my for петля. Несмотря на то, что размер моего массива сейчас меняется, for Цикл все еще останавливается после 5-й итерации, поскольку переменная длины не меняется, когда array.length изменения.

Теперь я могу проверить свой код с помощью предельных случаев, которые я придумал раньше, и убедиться, что результаты соответствуют ожиданиям:

// Passing in an empty array yields an empty array correctly:[] => []
// Passing in an array with only 1 element yields the correct array with 2 elements:[1] => [1,1]
// Passing in an array with only 2 elements yields the correct array with 4 elements:[1,2] => [1,2,1,2]
// Passing in an array with 10 elements yields the correct array with 20 elements:[1,2,3,4,5,6,7,8,9,10] => [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]

Альтернативные решения

Вышеприведенное является одним из способов решения этого вопроса, но есть и несколько других альтернатив. Помните, когда я представил вопрос выше с предложением вызвать функцию, написав что-то вроде myArray.double()? Если вы знакомы с объектно-ориентированным программированием, вы можете узнать этот синтаксис. В этом случае общая идея заключается в том, что вы действительно добавляете метод массива с названием double используя цепь прототипов, которую вы потом сможете вызвать.

Вот пример того, как я мог бы это сделать с помощью for структура цикла из моего исходного решения:

Array.prototype.double = function() {  var length = this.length;
  for (var i = 0; i < length; i++) {    this.push(this[i]);  }
  return this;}
var myArray = [1,2,3,4,5];
myArray.double();=> [1,2,3,4,5,1,2,3,4,5]

Определяя функцию с помощью цепочки прототипов JavaSacript, мне действительно не нужно ничего передавать в нее, поскольку я имею доступ к массиву, с помощью которого вызывается метод this. Чтобы узнать больше о this ключевое слово, прочтите документы MDN.

Теперь эти решения отличные, но как относительно ответа на этот вопрос без использования a for петля? Одним из способов является использование встроенного метода JavaScript forEach. Это та же идея, что и for цикла, но вместо того, чтобы мы указывали программе, как выполнять наш код (императивное программирование), мы расскажем ей, каков результат (декларативное программирование). Вы можете прочитать больше об императивном и декларативном программировании здесь.

Вот пример использования того же решения forEach:

var array = [1,2,3,4,5];
var double = function(array) {
  array.forEach(function(value) {    array.push(value);  });
  return array;}
double(array);=> [1,2,3,4,5,1,2,3,4,5]

ВРЕМЯ исполнения: O(n) = линейный

Наконец вот еще одно решение этой проблемы, которое я нашел с помощью нескольких быстрых поисков в Google.

Существует также встроенный метод массива под названием concat которые вы можете использовать:

var array = [1,2,3,4,5];
var double = function(array) {  var doubled = array.concat(array);
  return doubled;}
double(array);=> [1,2,3,4,5,1,2,3,4,5]

ВРЕМЯ исполнения: O(n) = линейный

ПРИМЕЧАНИЕ: Если вы думаете о поиске Google во время экрана телефона, то мое мнение после участия в более чем дюжине технических экранов телефонов: обычно это вполне приемлемо.

Технические экраны телефонов часто запланированы от 45 минут до 1 часа. Часть этого времени зарезервирована для того, чтобы интервьюер задал вопрос о вашем опыте, а часть также зарезервирована для вас, чтобы задать вопрос. Время, которое вы тратите на кодировку, может составлять от 30 до 45 минут в зависимости от компании и интервьюера.

Во многих случаях ваш интервьюер сможет помочь вам скорыми советами и небольшими подсказками, если у вас есть общее представление о том, как что-то делать, но вам нужно выяснить особенности. Например, когда-то у меня был интервьюер, знавший регулярное выражение, которое мне нужно для выполнения определенной функции, поэтому мне не нужно было тратить время на его выяснение. Это позволило продолжить беседу более беспроблемно.

Однако у меня тоже был опыт, когда интервьюер просил меня переделать мое исходное решение другим способом и прямо сказал, что искать документацию можно. Обычно это так, потому что многие разработчики ежедневно тратят время на чтение или ссылку на документы. Возможность следовать этой же схеме во время технического телефонного интервью – хороший знак.

Однако поиск в Google решения во время собеседования также может стать потерей времени, особенно если вы ищете не только правильную фразу (именно здесь чем больше вы ищете, тем лучше станете).

Для этого конкретного примера, если бы я уже знал о методе concat JavaScript, он мог бы приходить в голову, когда я столкнулся с этой проблемой. Тогда можно было бы погуглить, чтобы напомнить себе, как работает concat.

Но если бы вместо этого потратил время на поиск в Google, как удвоить массив, прежде чем даже попытаться самостоятельно продумать проблему, это могло бы быть красным флагом для интервьюера. Технические экраны телефонов – это хороший способ для интервьюера понять, как вы думаете, и действительно зависит от того, что они ищут с точки зрения должности, на которую он нанять.

С другой стороны, некоторые компании четко скажут вам, что вам запрещено использовать Google с помощью, поэтому в таких случаях лучше этого не делать. Конечно, если вы вообще не уверены, спросите у своего интервьюера.

Вывод

Почему я показываю все эти примеры? Как видите, нет единственного способа подойти к этой проблеме. Вы можете применить несколько подходов, и то, как вы подходите к проблеме, зависит от сочетания вашего опыта и того, как вы думаете о решении проблемы. Для меня я часто тяготею к петель с тех пор for циклы были одной из оригинальных концепций программирования, которые я изучил. Но тот, кто употреблял concat раньше мог подумать об этом сразу.

Я подумал, что эта проблема является хорошим примером, потому что поначалу она кажется относительно простой. Однако есть способы зацепиться (как вы видели в моем бесконечном цикле выше), и есть несколько решений, которые демонстрируют разные уровни конкретных знаний. Тем не менее, вы также можете решить эту проблему, используя надежную идею, написанную псевдокодом и некоторым поиском в Google.

Имейте в виду, что вы не всегда проходите технические телефонные собеседования, но чем больше вы их проводите, тем лучше у вас будет. И если вы что-то узнали из интервью, даже если это было что-то небольшое, это, вероятно, стоит вашего времени.

Последний совет

Всегда не забывайте поблагодарить интервьюера по электронной почте, желательно до конца того же рабочего дня, когда вы проводили собеседование с ним. Даже если компания не является вашим лучшим выбором, кто-то выделял время из своего напряженного графика, чтобы взять у вас интервью, поэтому важно поблагодарить его. И если вы узнали что-то новое, быстрое сообщение с благодарностью – отличный способ подтвердить это.

Каков был ваш опыт с техническими телефонными интервью? ты их любишь? Ты их ненавидишь? Какая интересная проблема, которую вам просили решить? Оставьте комментарий ниже или дайте мне знать, отправив мне письмо по адресу jane [at ] fullstackinterviewing [dot ] com.

Вам понравилась эта статья? Вам интересно получить свою мечту в области разработки программного обеспечения? Подпишитесь на мой список рассылки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *