Загрузка…
Загрузка…
backend / middle / tech_screening
Формат
online
Стадия
tech_screening
Когда
within_quarter
Длительность
60 мин
01
Код
Найти максимальный по длине строго монотонный (строго возрастающий или строго убывающий) подотрезок массива чисел.
Лайвкодинг, решение писалось на C++. Кандидат шёл линейно по массиву, отслеживая длины возрастающих и убывающих участков и стартовые индексы. Интервьюер просил найти опечатку в рабочем коде.
02
Теория
Оцените сложность вашего решения первой задачи по времени и по памяти.
Ожидался ответ: время O(n), память O(1)/O(n).
03
Код
Дан массив целых чисел (возможны отрицательные). Найти непустой подотрезок с заданной суммой X, либо сказать, что такого нет (вывести индексы начала и конца или -1 -1).
Решение на C++. Кандидат сначала предложил sliding window, но интервьюер контрпримером показал, что из-за отрицательных чисел оно не работает. Пришли к решению через префиксные суммы и map. Интервьюер несколько раз предъявлял тесты, на которых код выдавал неверный ответ (баги: использование i вместо i-1, неучёт случая prefix>target, вычитание собственного индекса). В конце интервьюер подсказал инициализировать map нулём по нулю, чтобы убрать лишнюю проверку.
04
Теория
Почему решение второй задачи через префиксные суммы с линейным поиском работает за O(n^2)? Объясните, откуда берётся квадрат.
05
Теория
Как ускорить решение с O(n^2) до O(n) по времени, используя хеш-таблицу (map значений префиксных сумм)? Как при этом изменится потребление памяти?
Обсуждали, что память остаётся O(n), а время становится O(n).
06
Кейс
Можно ли решить задачу про подотрезок с суммой X, ограничив себя константной O(1) дополнительной памятью, и за какое время (например, за O(n^2))?
Обсуждение компромисса время/память: два вложенных цикла, перебор начала и конца отрезка.
07
Теория
Как бы вы тестировали такой код? На каких входных данных?
Кандидат назвал: пустой массив, все отрицательные, все положительные, микс, повторяющиеся (одинаковые префиксные суммы), массив из одного элемента; мысленный прогон кода и юнит-тесты.
Заметки
Алгоритмическое лайвкодинг-собеседование. Интервьюер работает в Яндексе (в Алисе), пишет на C++ и Python, ~4 года в Яндексе. Кандидат — студент 2 курса Московского Политеха, основной язык Go, но решал задачи на C++; около года решает алгоритмы (контесты Яндекса, олимпиадные задачи). Задачи проверяются глазами, без запуска в системе. Упоминается формат 'школы' на плюсах.
Подготовка
Тренировать алгоритмы на массивах: two pointers / sliding window, префиксные суммы. Помнить, что sliding window ломается на отрицательных числах — нужен подход через map префиксных сумм. Уметь оценивать асимптотику по времени и памяти и обосновывать её вслух. Заранее продумывать edge cases (пустой массив, отрицательные/положительные, повторяющиеся префиксные суммы, одинаковые суммы). Трюк: инициализировать map нулём (prefix=0 -> index=0), чтобы убрать лишние проверки.
Стиль интервьюера
Доброжелательный, поощряет рассуждать вслух, даёт подсказки и наводящие вопросы. Не указывает на баги прямо, а предъявляет конкретные тесты, на которых код падает, и просит самостоятельно найти ошибку. Постоянно спрашивает про сложность по времени и памяти, подталкивает к оптимальному решению (O(n) время / O(n) память), хвалит за прогресс.