Узнайте, как объяснение решения вслух перед написанием кода помогает проходить собеседования и решать задачи. Попробуйте технику прямо сейчас!
Честно говоря, я был в цикле, который хуже бесконечного while(true). Я часами решал задачи на LeetCode, сразу бросался писать код и упирался в стену: моё решение работало на примерах, но падало на скрытых тестах. Я смотрел на экран в отчаянии, задаваясь вопросом, почему не могу «видеть» ответ, как профи. Переломный момент наступил после особенно жёсткого пробного собеседования, где интервьюер постоянно спрашивал: «Можете провести меня по вашему процессу мышления?» Я что-то пробормотал про хеш-таблицы и понял, что ничего не объяснил — просто написал код и надеялся на лучшее. Этот момент ощущался как потеря сердца в данже: я знал, что у меня есть потенциал, но не хватало правильного инструмента, чтобы открыть следующую дверь.
Техника, которая наконец решила проблему, — объяснение моего решения вслух — сначала резиновой утке, затем воображаемому интервьюеру — до написания кода. Звучит глупо, но выслушайте. Когда вы заставляете себя вербализовать алгоритм, вы вскрываете пробелы в понимании, которые скрывает молчаливый набор кода. Это как использовать Песнь времени, чтобы замедлить мир и увидеть каждый шаг чётко.
Вот точная формулировка, которую я использовал для каждой задачи:
Я держал маленькую резиновую утку на столе (да, классический помощник программиста) и буквально разговаривал с ней. Если я запинался или понимал, что забыл упомянуть случай, я останавливался, исправлял объяснение и только потом открывал редактор.
Задача: дан массив целых чисел nums и целое число target, верните индексы двух чисел, сумма которых равна target.
Моя старая привычка — сразу писать код:
def two_sum(nums, target):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
return []
Я запускал, видел, что работает на примере, чувствовал себя хорошо, а потом получал ошибку на скрытых тестах с дубликатами или отрицательными числами, потому что не продумал оптимизацию с хеш-таблицей и краевой случай, когда один и тот же элемент нельзя использовать дважды.
Теперь я сначала объясняю.
Объяснение (вслух):
target.target - num) в хеш-таблицу. Если текущее число уже есть в таблице как ключ, мы нашли пару.nums = [2,7,11,15], target = 9. i=0, num=2 → дополнение=7, таблица пуста → сохраняем {7:0}. i=1, num=7 → 7 есть в таблице → возвращаем [0,1].Только после этого я писал код:
def two_sum(nums, target):
"""
Возвращает индексы двух чисел, сумма которых равна target.
Предполагается, что решение существует ровно одно.
"""
complement_to_index = {} # значение -> индекс
for i, num in enumerate(nums):
complement = target - num
if complement in complement_to_index:
return [complement_to_index[complement], i]
complement_to_index[num] = i
# Согласно условию, эта строка не должна быть достигнута.
raise ValueError("No two sum solution exists")
Заметили разницу? Объяснение заставило меня подумать о хеш-таблице до того, как я начал печатать, и docstring теперь отражает мои вербализованные предположения.
Прыжок сразу в код ведёт к синдрому «разберусь по ходу». Вы упустите краевые случаи и потратите время на отладку.
Говорить «я использую хеш-таблицу», не уточняя, что вы храните (ключ или значение), бесполезно. Будьте точны: «сохраняю дополнение → индекс».
С тех пор как я приобрёл эту привычку, мои результаты на собеседованиях резко изменились. Я перешёл от молчаливого написания кода к уверенному проведению интервьюера через мой процесс мышления — как Линк, уверенно вытаскивающий Меч Мастера. Интервьюер видит не только, что я умею кодить, но и что я могу коммуницировать свои рассуждения, что часто является отличительным фактором в FAANG.
Вне собеседований эта техника улучшила моё повседневное решение проблем. Когда я застреваю на баге на работе, я теперь останавливаюсь, объясняю проблему своей резиновой утке (или коллеге), и решение часто появляется ещё до того, как я касаюсь клавиатуры. Это сэкономило мне часы разочаровывающих догадок и сделало меня более надёжным членом команды.
Готовы попробовать? Вот ваш квест:
Поделитесь в комментариях, какую задачу вы решили и как шаг объяснения изменил ваш подход. Я болею за вас — идите и сокрушайте собеседования, как герой, возвращающий Трифорс! 🚀
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →