Ctrl K
Урок

Как проходить этот курс

Зачем вообще эти алгоритмы на собесе

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

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

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

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

Что на самом деле оценивают

Навык Как это выглядит Чего боятся интервьюеры
Мышление вслух Ты проговариваешь идеи, даже сырые Тишина 10 минут, потом готовый код
Сложность Ты называешь время и память: O(n), O(n log n) «Ну, вроде быстро работает»
Крайние случаи Пустой ввод, один элемент, дубликаты, отрицательные числа Код падает на []
Чистый код Понятные имена, без лишних веток, логика читается a, b, tmp2 и пять вложенных if

Даже неидеальное решение с хорошим объяснением часто ценится выше молча написанного оптимального.

Ты не сдаёшь экзамен. Ты показываешь, как будешь работать в команде. Говори, рассуждай, задавай вопросы: это засчитывается.

Как устроен курс

Каждая глава построена по одной схеме из трёх шагов.

  1. Урок. Короткое объяснение приёма: сначала интуиция и аналогия из жизни, потом схема, шаблон кода, сложность и типичные ошибки. Такой урок, как этот, читается минут за пять–десять.
  2. Задачи с автопроверкой. Ты сам пишешь решение, его прогоняют на тестах, включая коварные крайние случаи. Это и есть основная тренировка.
  3. Объяснить голосом. Ты рассказываешь интервьюеру своё решение так, как рассказывал бы на настоящем собесе: идею, почему она работает, сложность, крайние случаи. Интервьюер задаёт уточняющие вопросы.

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

Если задача не идёт больше 20–30 минут, вернись к уроку, перечитай шаблон и попробуй снова. Это нормальная часть обучения, а не провал.

Как решать задачу на собесе: 7 шагов

Этот порядок пригодится в каждой задаче курса. Со временем он станет привычкой.

1. Уточни условие. Перескажи задачу своими словами и спроси о том, что неясно. Каков размер входа? Бывают ли отрицательные числа и дубликаты? Отсортирован ли массив? Что вернуть, если ответа нет?

2. Разбери примеры. Возьми маленький пример и прогони его руками. Например, нужно найти два числа с суммой 9:

20
71
112
153
Цель 9: подходят 2 и 7 — индексы 0 и 1

Потом придумай пример похитрее: пустой массив, один элемент, ответа нет.

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

4. Улучши. Спроси себя, где делается лишняя работа. Может, поможет сортировка, два указателя или хеш-таблица? Как раз этим приёмам и посвящён курс. Обсуди идею с интервьюером до того, как начнёшь писать код.

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

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

7. Оцени сложность. Назови время и дополнительную память и объясни, откуда они берутся.

Как это звучит вслух

Примерно так:

«Правильно понимаю, что массив не отсортирован и ответ всегда существует? Первое, что приходит в голову, — перебрать все пары, это O(n²). Можно быстрее: идти по массиву и хранить уже увиденные числа в хеш-таблице. Тогда для каждого числа проверяю, встречалось ли target − x. Получается O(n) по времени и O(n) по памяти. Давайте напишу.»

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

Частые ошибки

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

Что дальше

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

Ты уже сделал первый шаг: понял правила игры. Поехали.