Алгоритмические собеседования в Яндексе: как подготовиться и чего ожидать

Какие задачи придётся решать на алгоритмических секциях и какие вопросы чаще всего задают кандидатам.

Алгоритмическая секция — обязательный этап собеседования для любого разработчика. На этом этапе проверяется умение писать чистый код и придумывать нетривиальные решения. Мы поговорили с заместителем руководителя отдела технологий распределённых вычислений Яндекс Облака Игнатом Колесниченко и разработчиком команды Александрой Латышевой о том, как они сами проходили интервью и о чём спрашивают кандидатов.

Как устроена алгоритмическая секция

Эта секция длится час, с учётом времени, которое интервьюер и кандидат тратят на объяснение задач. Придумать решение и реализовать замысел желательно за 30—40 минут.

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

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

Лучшая тактика — подробно обсудить полученную задачу и объяснить планируемое решение. Сначала кандидат излагает идеи своего решения, а интервьюер уточняет непонятные моменты (если они есть) и детали устройства алгоритма, а также узнаёт, какая будет сложность у полученного решения. Обсуждение — важная часть процесса: благодаря ему кандидат правильно поймёт задачу и найдёт оптимальное решение, а интервьюер увидит, насколько далеко кандидат продвинулся в продумывании решения.

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

Лучше потратить на пять минут больше, но получить хорошо читаемое решение, которое легко проверить, чем поспешить и получить что-то невнятное. Пока кандидат пишет, собеседующий следит и задаёт вопросы, а в конце даёт пару минут на перепроверку.

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

Вторая задача чуть сложнее. Для её решения требуется понимание стандартных структур данных — деревьев поиска и хэшмапов — и умение собрать из них решение.

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

Самая частая проблема со вторым заданием — нехватка времени. Кандидаты нередко зависают на этапе разбора задачи и не успевают написать код.

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

Как подготовиться к алгоритмической секции

Учитесь тестировать собственный код. Бывает, что кандидаты не могут самостоятельно найти недочёт в коде, пока интервьюер на него не укажет. При этом скомпилировать код на алгоритмической секции не получится: прогонять код по тестам придётся в голове. Нехватка этого навыка может стать помехой в будущей работе: на проверку кода будет уходить больше времени или, что ещё хуже, в продакшн попадут баги, которых можно было избежать. К счастью, это умение можно развить, например, тренируясь проходить контесты на Codeforces, в особенности ту часть, где нужно искать ошибки в чужих решениях.

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

Тренируйтесь в решении алгоритмических задач. Подойдёт любая платформа для подготовки к техническим собеседованиям, например LeetCode или тренировки по алгоритмам Яндекса. Даже если вы уже умеете писать чистый декомпозированный код, решать алгоритмические задачи полезно: это учит находить нетривиальные, но при этом не слишком сложные варианты решений, оптимальные по скорости, сложности и потребляемым ресурсам.

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

Как вести себя на собеседовании

Если вы готовитесь к первому в своей жизни алгоритмическому собеседованию, то советуем вам посмотреть видео с летнего фестиваля вакансий Яндекса, а также обратить внимание на советы Александры Латышевой — выпускницы ФКН ВШЭ. Свою первую стажировку она прошла в 2019 году, а сейчас работает в штате.

— Задавайте вопросы. Задачу могут поставить абстрактно, не уточняя, что в качестве входных данных могут быть, например, отрицательные числа, а вектор может быть пустым.

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

— Удостоверьтесь в том, что вы правильно поняли задачу. Спрашивайте, что нужно оптимизировать, какие ограничения по времени и памяти нужно учесть при выборе алгоритма.

— Правильно распределяйте время. Задачи две, а на собеседование даётся час, поэтому хорошо бы через полчаса иметь решение первой задачи. Если вы написали решение первой за сорок минут, придётся быстрее писать вторую.

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

Размеренная подготовка, правильный настрой, отсутствие страха задавать вопросы и объяснять свои мысли — главные составляющие успеха на собеседовании. Мы постарались подробно рассказать, что вас ждёт, осталось только пожелать удачи. Увидимся на стажировке!

Краткий пересказ от YandexGPT