Я провалил вопрос на собеседовании. Давайте позаботимся о том, чтобы мы оба извлекли урок.
Недавно у меня было техническое интервью, на котором мне задали этот вопрос:
Для заданного массива символов вернуть строку, в которой подсчитывается количество каждой последующей буквы.
Пример: [«a», «b», «b», «a»] должны возвращать «a1b2a1»
Кажется достаточно простым. Я уверен, что вложенный цикл for…
Может, нервы. Но за отведенные 20 минут я просто не могла разобраться. Зализав раны, я снова сел на эту лошадь и взглянул на нее свежим взглядом с помощью друга. Теперь это казалось таким простым.
Я думаю, что мой главный недостаток в интервью в том, что я не последовал своему собственному совету: делайте это в первую очередь как человек. Записывайте, что я сделал. Псевдокод. Затем переведите в код. Давайте сделаем это здесь (практика ведет к совершенству, не так ли?):
- Я вижу, что первым элементом моего массива является «а». Я принимаю это к сведению.
- Я смотрю на следующий элемент. Это «б», что не похоже на мою первую. Итак, я должен просто отметить, что моя строка должна начинаться с «a1».
- Теперь я смотрю на букву «b», и следующая за ней также является буквой «b», но следующая за ней не является буквой «b», поэтому я должен мысленно отметить «b2».
- Последний - «а», поэтому добавлю «а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».
Было немного обидно получить этот относительно простой вопрос на собеседовании, и я не смог выбить его из общего ряда. Но именно поэтому я всегда говорю ...
Настойчивость ›талант
Получу в следующий раз :-)
Спасибо за прочтение!