Подготовка к алгоритмическим задачам

Сорок минут на задачу: как распределить время на алгоритмической секции
Коротко
| Этап | Время | Доля |
|---|---|---|
| Уточнение условия | 3–5 мин | ~10% |
| Обсуждение подхода | 8–10 мин | ~25% |
| Написание кода | 15–20 мин | ~45% |
| Проверка и вопросы | 5–7 мин | ~20% |
Главная ошибка тайминга — сразу начать писать код. Вторая — застрять на обсуждении и не успеть написать.
Почему тайминг решает
Задача на интервью подобрана так, чтобы её можно было решить за отведённое время вместе с обсуждением. Если вы потратили тридцать минут на поиск оптимального решения и написали половину кода — секция засчитывается как незавершённая, даже если ход мысли был верный.
И наоборот: код, написанный за десять минут без обсуждения, часто оказывается решением не той задачи.
Чувство времени тренируется отдельно. Полезно решать задачи дома с таймером — не чтобы торопиться, а чтобы знать, сколько на самом деле занимают этапы.
Этап 1. Уточнение — 3–5 минут
Кажется, что это трата времени. На деле это единственная страховка от решения не той задачи.
Что делать:
Повторите условие своими словами и дождитесь подтверждения. Двадцать секунд.
Задайте вопросы про ограничения:
- какой размер входных данных;
- могут ли быть отрицательные числа, нули, дубликаты;
- отсортированы ли данные;
- что возвращать, если ответа нет;
- можно ли менять входной массив.
Зачем ещё: размер входа определяет допустимую сложность. Если n до 10⁵, решение за O(n²) не пройдёт — и лучше узнать это до того, как вы его напишете.
Плюс уточняющие вопросы оцениваются отдельно как признак опытного инженера.
Красный флаг: если вы потратили больше семи минут на уточнения, вы тянете время. Переходите дальше.
Этап 2. Подход — 8–10 минут
Самая ценная часть секции и та, которую чаще всего скомкивают.
Порядок:
- Проговорите наивное решение и назовите его сложность. Всегда, даже если оно очевидно плохое.
- Найдите узкое место: что пересчитывается дважды, где лишний перебор.
- Предложите оптимизацию и назовите новую сложность.
- Проговорите компромисс: «размениваем O(n) памяти на ускорение с квадрата до линии».
- Дождитесь реакции интервьюера — обычно он кивнёт или задаст уточняющий вопрос.
Ключевой момент: не начинайте писать код, пока не получили подтверждения, что подход разумный. Молчаливое согласие тоже считается — если интервьюер не возражает, можно двигаться.
Красный флаг: прошло двенадцать минут, а вы всё ещё перебираете идеи. Пора остановиться и написать хоть что-то — лучше наивное решение целиком, чем оптимальное наполовину.
Этап 3. Код — 15–20 минут
Пишите скелет первым. Сигнатура, основной цикл, return. Потом наполняйте.
Комментируйте вслух, но без фанатизма — смысл блоков, а не каждую строку.
Не вылизывайте. Идеальные имена и вынесение в отдельные функции — потом, если останется время. Сначала рабочая логика.
Красный флаг: осталось десять минут, а код написан наполовину. Скажите об этом вслух: «времени немного, я допишу основную логику, а обработку крайних случаев проговорю словами». Это лучше, чем молча не успеть.
Этап 4. Проверка — 5–7 минут
Этап, который пропускают чаще всего, — и зря, потому что он дешёвый и производит хорошее впечатление.
Прогоните пример руками. Возьмите вход из условия и выпишите значения переменных по итерациям. Вслух.
Проговорите крайние случаи: пустой ввод, один элемент, все элементы одинаковые, отрицательные числа.
Назовите итоговую сложность по времени и памяти.
Спросите, есть ли вопросы. Часто следом идёт «а как бы вы изменили решение, если...» — это продолжение секции, и к нему стоит быть готовым.
Что делать, если время уходит
Осталось 15 минут, подход не найден. Пишите наивное решение. Работающий перебор плюс фраза «понимаю, что это квадрат, оптимизировал бы через хеш-таблицу» — часто проходной результат.
Осталось 10 минут, код на треть. Скажите вслух и сфокусируйтесь на главном цикле. Крайние случаи проговорите словами.
Осталось 5 минут, код почти готов. Не начинайте рефакторить. Допишите, быстро проверьте на примере, назовите сложность.
Время вышло, решение не готово. Спокойно подведите итог: что сделали, что осталось, как бы доделали. Это лучше, чем оборвать на полуслове.
Как тренировать чувство времени
Ставьте таймер на 40 минут при домашнем решении. Не для гонки — для калибровки.
Засекайте этапы. Первые несколько раз отмечайте, сколько ушло на уточнения, подход и код. Почти наверняка обнаружите перекос.
Типичный перекос новичков: 1 минута на уточнения, 2 минуты на подход, 35 минут на код с переписыванием.
Типичный перекос опытных: 15 минут на подход в поисках красивого решения, 20 минут на код, ноль на проверку.
Практикуйте «остановиться и написать». Отдельное упражнение: дайте себе десять минут на поиск подхода, и если не нашли — пишите наивное. Это тренирует умение не залипать.
Что запомнить
- Задача рассчитана на решение вместе с обсуждением, а не только на код.
- Пропорция примерно 10/25/45/20: уточнения, подход, код, проверка.
- Не пишите код, пока не проговорили подход и не получили реакции.
- Двенадцать минут без подхода — сигнал писать наивное решение.
- Заканчиваете — обязательно проверьте на примере и назовите сложность.
- Тренируйте с таймером и засекайте этапы: перекос обнаружится сразу.
Решай алгоритмические задачи как профи

