Как нужно себя вести на алгоритмическом собеседовании
Пошаговый план, чтобы решить любую задачу и получить заветный "Hire" 👍.
Здесь мы не будем обсуждать подготовку и предположим, что к алгоритмам ты уже готов(а). Если нет, то вот тебе
ссылка на подробный план, как подготовиться.
Итак, как же действовать на собеседовании:
1️⃣ Нужно
понять, в чём заключается проблема• Прочитай вопрос (дважды! Да-да, потрать несколько дополнительных минут, но пойми задачу правильно).
• Возьми 1-2 примера и на них вслух воспроизведи проблему, а также то, что должно быть получено на выходе.
• Не стесняйся задавать уточняющие вопросы:
• Разбери возможные edge cases (крайние случаи).
• Разбери входные и выходные данные, их тип, что они могут в себе содержать, а также ограничения размеров (скорее всего, интервьюер скажет, что размер либо очень большой, либо небольшой, и тебе не стоит переживать на этот счёт. Уточнить всё равно стоит).
2️⃣ Как только мы разобрали, в чём собственно проблема, самое время
предложить решение• Начни с метода грубой силы (он же brute force или naive approach). Это когда ты предлагаешь самый простой вариант решения — обычно самый неоптимальный, но зато очевидный. Это необходимо: если ты не найдёшь решения лучше, у тебя уже будет хоть какой-то рабочий вариант. Помни, что написать плохое, но рабочее решение лучше, чем вообще ничего. Всё равно есть шанс получить хотя бы “weak hire” даже с самым naive решением.
• Оцени сложность по времени и памяти. На собеседованиях мы работаем с worst-case scenario (худшим сценарием).
• Ищи зацепки в описании задачи. Например, если массив отсортирован, нужно найти кратчайший путь, топ-К элементов и тому подобное. Это поможет понять, в каком направлении копать.
• Если же ты никак не можешь понять, как решить задачу, то примени бустеры -
BHDCA (Boosters Help Developers Crack Algorithms):
•
Brute force optimizations - посмотри на своё наивное решение. Если там есть зацепки вроде вложенных циклов или повторяющихся действий, то это потенциальное место для оптимизации.
•
Hunt for properties - ищи математические или логические свойства. Ты как бы прищуриваешься и спрашиваешь себя: «А какое скрытое правило или закономерность здесь работают? Могу ли я сжульничать (в хорошем смысле) благодаря математике или логике?»
•
Decrease the difficulty - упрости задачу. Например: если нужно идти в 4 направлениях, упрости и сначала реши так, будто направление всего одно.
•
Cycle through the Catalog - мысленно пробегись по тому, какие структуры данных и алгоритмы ты учил(а).
•
Articulate your blocker - скажи интервьюеру, что ты застрял(а), объясняя, что именно не можешь найти. Рассуждай вслух. Это даст твоему интервьюеру возможность помочь.
3️⃣
Объясни интервьюеру решение полностью.
• Напиши очень коротко, используя слова или псевдокод, как это будет работать (не вдавайся в детали, сделай это максимально коротко и быстро).
• Посчитай временную и пространственную сложности.
4️⃣ ОЧЕНЬ ВАЖНО: Когда решение презентовано,
получи «зелёный свет» от интервьюера.
Спроси, хочет ли он, чтобы ты писал(а) код этого решения, или же стоит его оптимизировать / подумать о другом подходе. Если интервьюер попросил найти более оптимальный вариант, то начни шаг номер 2 заново.
5️⃣
Пишем код
• Сначала пишем основную логику.
• После - helper functions.
• Если застрял(а), то остановись, возьми какой-нибудь пример и пройдись шаг за шагом по коду.
6️⃣
Проверяем решение
Как только код полностью написан, нам обязательно нужно его проверить:
• Идём сверху вниз, будто мы отладчик (debugger).
• Все каверзные куски кода проверяем особенно тщательно.
• Сначала проверяем на простых примерах, после чего усложняем.
• Проверяем edge cases, которые обсудили в самом начале.
• Чекпоинтимся с интервьюером, что его всё устраивает.
Вот и всё! Работа мечты почти в кармане 😉. Не забывай, что интервьюер на собеседовании для того, чтобы найти хорошего кандидата, а не завалить тебя. Если в компании токсичное интервью, ты уверен(а), что тебе будет комфортно там работать?