Я провалил вопрос на собеседовании. Давайте позаботимся о том, чтобы мы оба извлекли урок.

Недавно у меня было техническое интервью, на котором мне задали этот вопрос:

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

Пример: [«a», «b», «b», «a»] должны возвращать «a1b2a1»

Кажется достаточно простым. Я уверен, что вложенный цикл for…

Может, нервы. Но за отведенные 20 минут я просто не могла разобраться. Зализав раны, я снова сел на эту лошадь и взглянул на нее свежим взглядом с помощью друга. Теперь это казалось таким простым.

Я думаю, что мой главный недостаток в интервью в том, что я не последовал своему собственному совету: делайте это в первую очередь как человек. Записывайте, что я сделал. Псевдокод. Затем переведите в код. Давайте сделаем это здесь (практика ведет к совершенству, не так ли?):

  1. Я вижу, что первым элементом моего массива является «а». Я принимаю это к сведению.
  2. Я смотрю на следующий элемент. Это «б», что не похоже на мою первую. Итак, я должен просто отметить, что моя строка должна начинаться с «a1».
  3. Теперь я смотрю на букву «b», и следующая за ней также является буквой «b», но следующая за ней не является буквой «b», поэтому я должен мысленно отметить «b2».
  4. Последний - «а», поэтому добавлю «а1» к моей мысленной заметке.

Вот как я это делаю естественно. И сразу могу сказать,

  • Я повторяю
  • Я с нетерпением жду своей текущей итерации
  • Я накапливаю количество раз, когда вижу элемент
  • Я добавляю это в свою мысленную заметку на основе определенных условий

Давайте начнем переводить это в код. Сначала я инициализирую пару переменных:

  • Строка result для размещения моего ответа
  • Переменная counter для подсчета количества раз, когда я вижу элемент. Я инициализирую счетчик цифрой 1.
function cntConsecutiveElements(array) {
  let result = "";
  let counter = 1;
}

Далее мы повторяем. Достаточно простого цикла for. Давайте попробуем на примере: [«a», «b», «b», «a»]

  • Первый элемент, который я вижу, будет начинаться со счетчика 1. Если следующий элемент совпадает с тем, с которым я в настоящее время повторяю итерацию, я должен увеличить свой счетчик:
function cntConsecutiveElements(array) {
  let result = "";
  let counter = 1;
for (let i = 0; i < array.length; i++) {
    if (array[i] === array[i + 1]) {
      counter++;
    } 
  }
  return result;
}
  • Если это не так, я должен сложить элемент и счетчик вместе, а затем добавить это к моему результату. После завершения итерации я должен вернуть результат:
(1) function cntConsecutiveElements(array) {
(2)   let result = "";
(3)   let counter = 1;
(4) for (let i = 0; i < array.length; i++) {
(5)    if (array[i] === array[i + 1]) {
(6)      counter++;
(7)    } else {
(8)      result += array[i] + counter;
(9)      counter = 1;
(10)    }
(11)  }
(12)   return result;
(13) }

Давайте рассмотрим код на нашем примере:

  • Когда i = 0, array [0] имеет значение «a».
  • В строке 5 мы спрашиваем: «a» = array [1]? Что ж, array [1] - это «b», поэтому ответ отрицательный.
  • Мы нажимаем оператор else в строке 7 и объединяем «a» и 1, чтобы сформировать «a1». Затем мы добавляем это к нашему результату, который теперь равен «a1».
  • Вернуться к началу петли. Когда i = 1, array [1] равен «b».
  • Мы снова спрашиваем: «b» = array [2]? На этот раз это так, поэтому мы увеличиваем наш счетчик до 2.
  • Когда i = 2, array [2] снова будет «b».
  • Снова мы спрашиваем: is «b» = array [3]. Массив [3] равен «а», поэтому ответ отрицательный.
  • Мы нажимаем оператор else и объединяем «b» и 2, чтобы сформировать «b2». Затем мы добавляем это к нашему результату, который теперь равен «a1b2».
  • Когда i = 3, array [3] равен «a».
  • Снова мы спрашиваем: «а» = массив [4]? Ну, массив [4] не определен. Так что определенно нет. Мы нажимаем оператор else и объединяем «a» и 1, чтобы сформировать «a1». Затем мы добавляем это к нашему результату, который теперь равен «a1b2a1».
  • На этом итерация завершена, и мы возвращаем строку «a1b2a1».

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

Настойчивость ›талант

Получу в следующий раз :-)

Спасибо за прочтение!