Как подготовиться к алгоритмическому собеседованию

Автор — Владимир Балун

ex-TeamLead в Яндекс
Алгоритмические секции собеседований традиционно вызывают жаркие споры об их эффективности и пользе для найма. Мы живём в реальности, в которой большие технологические компании продолжают активно их использовать.
За свою карьеру я побывал по обе стороны баррикад
С одной стороны я провёл десятки алгоритмических интервью в Яндекс, Тинькофф, Mail.ru и хорошо понимаю, что ожидает интервьюер и на какие нюансы он обращает внимание. С другой — я сам проходил такие интервью и работал в Тинькофф, Kaspersky Lab, Mail.ru, Ozon и Яндексе.

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

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

1. Какие навыки проверяет алгосекция

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

Многие разработчики считают, что алгоритмическая секция — это бинарная история: либо ты написал алгоритм за отведенное время, либо нет. Но на практике все немного сложнее.

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

Какие навыки оценивают на алгоритмических собеседованиях:

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

2. Процесс прохождения алгоритмических собеседований

Сегодня большинство алгоритмических интервью проходит онлайн — через Zoom или Google Meet вместе с разделяемым редактором кода.

Раньше значительно чаще встречались onsite-интервью с белой маркерной доской в офисе компании, на которой приходилось писать код. Такой формат все еще можно встретить, но он стал заметно реже.
Обычно на интервью выделяется один час
Примерный тайминг выглядит так:
Знакомство
около 5 минут
Решение задач
около 50 минут
Ваши вопросы в конце
около 5 минут
Интервьюер для алгоритмической секции готовит 2 задачи. Иногда бывает одна, но объемная.

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

Чаще всего интервьюеры рассчитывают, что кандидат решит две задачи за выделенное время. Исходя из того, что нужно решить 2 задачи, и у нас есть 50 минут чистого времени, получается, что на каждую отводится примерно 25−30 минут.

Конкретный тайминг может отличаться. Некоторые алгоритмы требуют написать довольно много кода (по меркам интервью). Другие, наоборот, пишутся быстро, но требуют больше времени на поиск идеи.

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

Что важно сделать перед собеседованием:

  • проверьте интернет-соединение заранее;
  • протестируйте камеру и микрофон;
  • подготовьте тихое место без отвлечений;
  • закройте все лишние вкладки и программы;
  • предупредите домашних, чтобы они вас не беспокоили;
  • убедитесь, что знакомы с платформой (многие дают возможность потренироваться).
Это очень простой, но очень важный шаг, потому что на практике многие кандидаты часто забывают о предварительной подготовке, из-за чего теряют важное время на самом интервью
Теперь, когда структура собеседования понятна, давайте разберем сам процесс алгоритмического собеседования шаг за шагом.

3. Знакомство с интервьюером

Длительность — 5 минут
В назначенное время и дату все начинается с того, что вы знакомитесь с интервьюером — знакомство занимает не более 5 минут. Он немного рассказывает о себе, а затем вы делитесь с ним своим опытом. Как правило, интервьюер уточняет опыт, стек и интересные проекты. Часто просит кратко описать недавнюю задачу или область, в которой вы работаете.
Знакомство нужно, чтобы:
  • интервьюер мог оценить ваши коммуникативные навыки и способность вести профессиональный диалог;
  • кандидат мог получить контекст о человеке, который будет его оценивать;
  • снизить напряжение и создать более комфортную атмосферу для обеих сторон.
Совет: не нужно пересказывать все ваше резюме. Важно подготовить заранее лаконичный рассказ на 1−2 минуты о вашем опыте, текущей роли, одном успешном кейсе и используемых технологиях.

4. Этапы при решении задачи

После знакомства интервьюер присылает ссылку на веб-редактор кода и рассказывает условие задачи. На решение у вас будет примерно 25−30 минут.
Совет: на этом этапе критически важно внимательно слушать. Многие кандидаты теряют баллы из-за того, что неправильно поняли условие. Делайте заметки, если собеседование проходит онлайн. Если что-то непонятно сразу — не стесняйтесь попросить повторить или уточнить.
Далее слово передается вам, и вы начинаете свое выступление. Частая ошибка кандидатов — сразу бросаться реализовывать алгоритм, поэтому ниже будет рекомендуемая структура по решению алгоритмической задачи на интервью.
Совет: если кандидат сразу озвучивает верный алгоритм, решает без ошибок — оценивать тут нечего. Либо он знал задачу, либо он уж очень хорош, поэтому лучше либо сразу сказать об этом, либо сделать вид, что вы встречаете такую задачу впервые.

1. Сбор требований

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

Обычно формулировки звучат абстрактно. Например: дан массив, надо что-то посчитать. Или дан граф, в нем нужно что-то найти.

В сборе требований выделяют направления, которые вам нужно прояснить:
  • Размер входных данных
    Если дан массив или строка, то какова их максимальная длина. Если граф, то сколько в нем вершин может быть. Прояснить этот момент очень важно, потому что можно получить подсказку, какой алгоритм тут может подойти, а какой наверняка не подойдет
  • Природа данных
    Стоит выяснить: какого типа данные и какой допустимый диапазон значений. Полезно задать вопрос про свойства входных данных. Например: отсортированы ли они?
Совет: сбор требований крайне важный шаг, который почему-то многие пропускают и переходят сразу к алгоритму. Понимание входных данных и налагаемых на них ограничений может дать вам большую подсказку в выборе алгоритма
Например, если размер входных данных достаточно маленький, то отсюда можно сделать вывод, что задача может подразумевать решение перебором.

С другой стороны для обработки строки длиной в миллион символов очевидно, что нужно будет стараться придумывать решение, которое будет эффективнее полного перебора (если конечно такое есть).

2. Разбор простого примера

Длительность — 1 минута
На этом шаге полезно взять какой-нибудь пример входных данных и разобрать его. Разбор примера позволит:
  • Лучше понять условие задачи
    Если условие было понято некорректно, то интервьюер поправит вас и предостережет от того, что вы будете решать не ту задачу. Решить не ту задачу, которую вам дали, досадно и обидно. Это точно интервьюер отметит и запишет далеко не в плюс, а также вы потратите на это драгоценное время
  • Заметить некоторые закономерности и натолкнуть вас на идею алгоритма
     
Совет: проговаривайте вслух все, что делаете — это позволяет интервьюеру вовремя скорректировать вас и уберегает от ситуации, когда вы неправильно понимаете условие и начинаете решать совсем другую задачу. Также не бойтесь сказать, что вы чего-то не знаете: лучше попросить помощи, чем тратить драгоценное время

3. Граничные примеры

Длительность — 1 минута
После разбора простого примера стоит подумать о граничных случаях. Что должен выводить алгоритм в случае пустых данных или состоящих из одного элемента? Может ли у нас случиться переполнение типа данных? Есть ли циклы в графе? Более конкретные случаи зависят от специфики задачи.

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

4. Предлагаемый алгоритм и оценка его сложности

Длительность — 5 минут
К этому моменту мы собрали требования, погрузились в условие задачи и выяснили граничные случаи. И пора переходить к обсуждению алгоритма. Обычно в голову приходит первая идея «наивного» подхода. Например, полного перебора. И это отличная точка старта для обсуждения. Стоит вкратце рассказать эту идею интервьюеру.

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

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

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

Например: у нас есть один подход, он будет работать за O (n*log (n)) по времени и O (1) по памяти. Также есть другой, который работает за O (n) по времени и O (n) по памяти. И дальше в зависимости от того, какой вычислительный ресурс (CPU или RAM) у нас более приоритетен, можно делать выбор в пользу конкретного алгоритма.

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

5. API

Длительность — до 1 минуты
Часть интервьюеров дает сразу описание функции со входными и выходными параметрами, которую надо реализовать. Другие же наоборот никак это не проговаривают.

В этой ситуации я бы рекомендовал явно обратить внимание на то, какой API для нашей функции мы выберем. Как она будет называться, какие входные параметры будет принимать и в каком виде и что будет возвращать.

Полезно также вспомнить про возвращение ошибок. Может показаться странным: «зачем стоит уделять этому время?». В лучшем случае — если пропустить эту часть, интервьюер не обратит на это внимание. В худшем — может сделать пометку, что кандидат не уделяет внимание проектированию API.

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

6. Структура кода в голове

Длительность — до 1 минуты
К настоящему моменту у нас есть все, чтобы приступить к написанию кода. И можно уже переходить к нему. Но лучше сделать паузу — сказать интервьюеру, что вам нужно подумать еще чуть-чуть о деталях реализации, и взять еще 20-30 секунд.

В этот момент стоит представить, как вы декомпозируете код, какие будут блоки и что вы планируете выделить в отдельные функции.
Я бы предложил разбить структуру кода так:
  • если нужна трансформация входных данных, то стоит их выделить в отдельную функцию;
  • если у нас есть повторяющиеся одинаковые блоки кода, их однозначно стоит выделить в отдельную функцию, чтобы не дублировать;
  • если нужно в конце результат расчетов как-то специально конвертировать к выходному формату, стоит выделить это в отдельную функцию;
  • если будет сильная вложенность циклов, возможно, стоит внутренние циклы тоже вынести в отдельную функцию.
Результатом этих размышлений должна быть структура программы, которую вы планируете писать. Это важно сделать сейчас, чтобы по ходу реализации не тратить время на удаление и переписывание кода, и в целом писать как «с чистого листа».

7. Написание кода

Длительность — 10 минут
Вся подготовительная работа проделана, алгоритм выбран, что писать — ясно. Пора приступить к самому интересному.

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

Во время реализации используйте «скелет функции»: сначала сигнатура + пустая реализация, затем ее содержимое. Это снижает шанс забыть что-то реализовать.

Интервьюер со 100% вероятностью отметит ваш стиль написания и отразит это в своем отчете об интервью, если ему что-то покажется не соответствующим общепринятым практикам.
Какие аспекты в написании кода повысят ваши шансы на положительное ревью:
  • Понятные названия функций и переменных
    Однозначно стоит избегать однобуквенных (за исключением общепринятых вида i для счетчика цикла), непонятных или ничего не означающих названий. Худшее, что можно сделать, — это давать названия функциям или переменным, которые будут путать читателя кода.
  • Декомпозиция
    Код нужно структурировать и разбивать на вспомогательные блоки, которые можно выделять в отдельные функции. Понятно, что 5 строчек особо не разобьешь и большого смысла в этом нет. Но если логически напрашивается выделение блока в отдельную функцию, то это стоит сделать. Любые повторы и копипасты обязательно надо выносить в переиспользуемую часть.
  • Обработка ошибок
    Стоит уделить отдельное внимание обработкам ошибок. Может ли тут произойти исключение? Возвращает ли библиотечная функция ошибку? Обязательно стоит про это подумать и все подобные ситуации обработать. Как минимум их стоит проговорить во время написания кода.
  • Граничные случаи
    Если алгоритм ведет себя иначе в граничных случаях — пустые входные данные, null-ы и т. д. — это стоит явно учесть и обработать. На этом этапе очень помогут те граничные примеры, которые мы выписали ранее.
  • Читаемость
    Код должен быть понятным и легко читаемым. Плохая читаемость может привести к тому, что интервьюер не поймет код, засомневается в корректности и решит, что вы не смогли написать то, что предложили. А это не в наших интересах.
  • Фокус на главном
    Есть кандидаты, которые начинают писать со вспомогательных функций, описывают все конструкторы для классов или хуже того — вообще начинают реализовывать то, что не относится к задаче.

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

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

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

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

Если же написать код «как в production» не получается (все же мы на интервью, время ограничено и задача достаточно искусственная), то полезно голосом проговорить, как бы вы сделали в рабочей ситуации.

8. Тестирование

Длительность — 5 минут
Одна из частых ошибок — это сказать «готово» сразу после ввода последнего символа вашей программы.
Совет: не ждите, пока интервьюер попросит вас протестировать код. Проактивно предложите: «Давайте протестируем решение на нескольких примерах»
Наверняка в коде могут быть ошибки. Даже если вы уверены, что обычно пишете корректный код с первого раза, стресс интервью может внести свои коррективы. Поэтому после написания решения обязательно переходите к тестированию. К этому моменту мы уже проделали часть мыслительной работы и подготовили тестовые сценарии — именно их и стоит проверить.

Я бы предложил взять базовый пример, с которого мы начинали, и виртуально потрассировать программу. При этом важно помнить, что цель тестирования — не только самому убедиться в корректности решения, но и убедить интервьюера, что алгоритм действительно работает правильно, потому что он тоже будет мысленно проверять ваш код.
Поэтому полезно вслух пройти по программе и проговорить:
  • как будут меняться значения переменных;
  • какие данные передаются в функции;
  • какие результаты из них возвращаются.
Также удобно выписать переменные прямо в редакторе и обновлять их значения во время трассировки. Это помогает не запутаться самому и делает процесс проверки более наглядным для интервьюера.
Если ваша программа содержит несколько функций и вам надо протестировать каждую из них, то есть 2 подхода:
  • «снизу вверх» — начать с проверки всех вспомогательных функций, удостовериться в их корректности и в конце дойти до основного тела алгоритма, который будет вызываться в начале работы программы;
  • «сверху вниз» — начинать с основной функции, протрассировать ее, принимая то, что вы ожидаете от вспомогательных функций как данность, а дальше по цепочке переходить к остальным функциям.
Правильного ответа каким подходом пользоваться нет. Многое зависит от конкретной задачи и ваших предпочтений.

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

9. Завершение и ваши вопросы

Длительность — 5 минут
В конце интервью, если остается время, можно дополнительно блеснуть знаниями. Например: указать, как еще лучше можно решить задачу или распараллелить, если задача это позволяет.

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

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

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

Резюмируем: короткий чек-лист решения задачи на собеседовании

Чтобы не держать всю структуру в голове, можете следовать простому чек-листу прохождения алгоритмического собеседования:
  • Соберите требования
    Уточните размер входных данных, тип и свойства данных, ограничения задачи
  • Разберите простой пример
    Это помогает убедиться, что вы правильно поняли задачу и иногда подсказывает идею алгоритма.
  • Подумайте о граничных случаях
    Пустые данные, один элемент, большие размеры входных данных, возможные переполнения и другие крайние ситуации.
  • Предложите алгоритм и оцените сложность
    Обсудите временную сложность, использование памяти и возможные альтернативные решения.
  • Определите API функции
    Продумайте название функции, входные параметры, формат возвращаемого результата и обработку ошибок.
  • Продумайте структуру кода
    Перед написанием кода быстро представьте структуру программы и декомпозицию на функции.
  • Напишите аккуратный и читаемый код
    Обращайте внимание на: понятные имена переменных, декомпозицию, обработку ошибок и граничные случаи.
  • Протестируйте решение
    Пройдитесь по коду на примерах, проговорите изменения переменных и убедитесь, что алгоритм работает корректно.
  • Задайте вопросы
    Узнайте интересующие вас детали о команде, продукте или процессах

5. Подготовка к алгоритмическому собеседованию

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

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

Как вернуть форму перед интервью

  • Прорешайте задачи, которые присылает HR
    Многие компании присылают список задач для подготовки. Не игнорируйте его и потренируйтесь. Например, когда я проходил собеседование в Яндекс, HR прислал список задач. Я их повторно прорешал перед собеседованием, и потом на алгосекции встретил несколько очень похожих задач.
  • Сделайте пару тренировочных интервью
    Очень полезно перед важным собеседованием сходить на пару интервью в компании, которые вам не очень интересны, или пройти мок-собеседования, чтобы снизить стресс и войти в нужный ритм.

тренируйтесь в it-interview.io

Платно с Senior/TechLead из BigTech или бесплатно с такими же разработчиками, которые готовятся к алгосекции. Telegram-бот «Мэтч» подберет напарника, даст вопросы, задачи и инструкцию по проведению

6. Типичные ошибки кандидата на алгоритмических собеседованиях

  • Теряется при подсказках или воспринимает наводящие вопросы как провал, а не как помощь интервьюера
  • Использует слишком короткие или непонятные имена переменных
  • Боится признать ошибку на глазах у интервьюера и не возвращается к улучшению своего решения
  • Сразу пишет код без предварительной подготовки
  • Пишет код без плана. Тратит время на исправления из‑за непродуманной логики
  • Задает мало уточняющих вопросов, потому что боится «выглядеть глупо»
  • Выдает сложные решения там, где есть простые
  • Плохо объясняет свое решение и пишет код молча
  • Показывает нерешительность, если застрял, и не описывает вслух мысли
  • Зубрит задачи вместо того, чтобы учить паттерны

7. Пошаговый план подготовки к алгоритмическому собеседованию

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

1. Изучить базовые структуры данных

Если вы не знаете базовых структур данных, вы просто не сможете решать большую часть задач, поэтому начать стоит с изучения следующих структур данных:
  • статический и динамический массив;
  • связные списки;
  • стеки и очереди;
  • двоичные деревья и двоичные деревья поиска;
  • двоичные кучи;
  • хеш-таблицы;
  • графы (со звездочкой).
Под изучением этих структур данных я подразумеваю, что их нужно самостоятельно реализовать, то есть фактически переписать с нуля. Только во время самостоятельной реализации мы знакомимся с большим количеством нюансов и тонкостей этих структур данных, которые чаще всего нужны на собеседованиях.

2. Разобраться с асимптотическим анализом

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

Структуры данных без сложной математики

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

3. Прорешать задачи на LeetCode по популярным категориям

Важно выбирать задачи, которые либо встречаются чаще всего, либо являются основополагающими для решения других. Я сам решил более 400 задач на LeetCode и хочу сказать, что большого смысла в этом нет — решив 100 задач, вы будете готовы к 80% алгоритмических собеседований на российском рынке.
Типичная ошибка — решать по 500−1000 задач, отбирая их в случайном порядке
Лучше выбрать 10−15 шаблонов задач и для каждого решить 5−10 представителей, чтобы научиться узнавать паттерн использования алгоритма по формулировке задачи.

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

Если хочется быстро прокачать конкретные темы, у меня есть интенсивы по отдельным алгоритмическим направлениям: два указателя, префиксные суммы, хеш-таблицы и т.д.

В них есть разбор ключевых паттернов и практика на задачах уровня реальных алгосекций

4. Развивать необходимые скиллы для собеседования

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

Перед запуском кода проверяйте его самостоятельно — учитесь придумывать тестовые кейсы и пограничные сценарии, а также тренируйте «мысленный запуск» кода. На интервью вам не дадут пользоваться отладчиком, поэтому если во время подготовки вы запустили код задачи и он оказался неправильным — пробуйте его отладить глазами.

5. Изучать разборы задач и наблюдать за тем, как проходят алгоритмические собеседования у других кандидатов

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

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

6. Постоянно обучаться

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

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

8. Материалы для самостоятельной подготовки

Книги:

  • «Грокаем алгоритмы» — отличный старт для понимания базовых вещей
  • «Карьера программиста», Г. Лакман Макдауэлл — разбор типовых задач
  • «Алгоритмы: построение и анализ», Кормен и др. — фундаментальная теория по алгоритмам и структурам данных.
  • «Думай как математик», Барбара Оакли

Онлайн-ресурсы для подготовки:

  • LeetCode
  • Codeforces
  • HackerRank
  • NeetCode
  • AlgoExpert

Инструменты:

  • Visualgo.net — визуализация алгоритмов
  • Big-O Cheat Sheet — шпаргалка по сложностям алгоритмов

9. Заключение

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

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

В конце статьи хочется поделиться небольшим исследованием, которое мы провели. Мы опросили более 600 разработчиков, которые проходили алгоритмические собеседования в различных Российских компаниях. На основе их ответов получилось следующее распределение тем:
Cамые популярные темы (около 15%):
  • хеш-таблицы — 14,1%;
  • два указателя — 13%;
  • бинарный поиск — 10,5%.
Высокочастотные темы (7-15%):
  • сортировки — 9,1%;
  • связнные списки — 8,6%;
  • плавающие окна — 8,1%;
  • деревья — 7,6%.
Среднечастотные темы (4-7%):
  • стеки и очереди — 6,6%;
  • математика — 6,1%;
  • графы — 5,6%.
Низкочастотные темы (2-4%):
  • матрицы — 4,7%;
  • префиксные суммы — 4,2%;
  • динамическое программирование — 3,7%;
  • кучи — 3,2%.
Редкие темы (менее 2%):
  • битовые операции — 2,7%;
  • задачи на интервалы — 2,2%;
  • поиск с возвратом — 1,7%.
Такое распределение показывает, что на интервью чаще всего встречаются базовые алгоритмические паттерны, а не самые сложные темы вроде динамического программирования или сложных графовых алгоритмов
Поэтому при подготовке важно сначала хорошо освоить фундаментальные техники — именно они дают наибольший эффект.

Успешных вам алгоритмических собеседований!

Другие статьи