Вопросы на собеседовании в Яндексе
Яндекс гоняет кандидатов по самой строгой связке: живой кодинг на алгосекциях, ML и статистика на секциях по специальности, SQL и System Design ближе к финалу. Ниже — вопросы того же формата и уровня из банка Сеньорчика: срез тем, которые чаще всего всплывают у кандидатов в Яндекс.
Что такое A/A-тест и зачем его гонять?
A)Обе группы получают одинаковый опыт — проверка сплита и метрикB)Тест, где на пользователей одновременно катят сразу две разные фичиC)Специальный приём, позволяющий ровно удвоить статистическую мощностьD)Эксперимент, запускаемый строго на одном проценте всего трафикапоказать ответ и разбор
+A)Обе группы получают одинаковый опыт — проверка сплита и метрик// разбор: A/A ловит битый сплит (неслучайное разделение, пересечение юзеров, sample ratio mismatch), баги логирования и некорректные тесты (например, обычный t-test на ratio-метрике с зависимостями). Если на сотнях симулированных A/A p < 0.05 выпадает заметно чаще 5% — платформе верить нельзя. Дёшево и обязательно перед доверием к A/B-инфре.
Что такое sample ratio mismatch (SRM) и почему при нём результаты теста нельзя интерпретировать?
A)Разная длительность экспозиции групп, которая лечится продлением тестаB)Несовпадение значений одной метрики между разными аналитическими дашбордамиC)Разница в размере наблюдаемого эффекта между отдельными сегментами юзеровD)Фактическое соотношение групп значимо ≠ заданному — попадание неслучайнопоказать ответ и разбор
+D)Фактическое соотношение групп значимо ≠ заданному — попадание неслучайно// разбор: SRM проверяется хи-квадратом на счётчиках попаданий; «крошечный» перекос на миллионах юзеров — почти наверняка систематическая потеря части трафика в одной группе (например, тяжёлая фича отваливает слабые устройства до логирования). Любой вывод при SRM — мусор: сначала найти и починить причину. В зрелых платформах SRM-алерт автоматический.
Почему использовать список Python как очередь через pop(0) — плохая идея на больших объёмах?
A)pop(0) сдвигает все оставшиеся элементы на одну позицию — это O(n), и очередь деградирует до O(n²)B)Pop(0) вообще не работает и бросает исключениеC)List физически не способен хранить больше миллиона элементов и упадёт с ошибкой памяти в одной непрерывной области оперативной памяти процессаD)Pop(0) меняет тип списка на кортежпоказать ответ и разбор
+A)pop(0) сдвигает все оставшиеся элементы на одну позицию — это O(n), и очередь деградирует до O(n²)// разбор: list — динамический массив: удаление с начала (pop(0)) требует сдвинуть все последующие элементы влево, это O(n). В цикле на n элементов получаем O(n²). Для FIFO нужен collections.deque — popleft() у него O(1), потому что это блочная структура с дешёвыми концами.
Алгоритм A — O(n log n), алгоритм B — O(n²). Когда осторожничать с выводом «A всегда быстрее»?
A)Ни при каком: асимптотика обеспечивает, что A быстрее на входе и железеB)Ровно при n = 0, в остальных случаях A строго быстрееC)При больших n, где именно B внезапно становится быстрее AD)При малых n: у A больше константа, и на практике B может обгонятьпоказать ответ и разбор
+D)При малых n: у A больше константа, и на практике B может обгонять// разбор: Асимптотика — про поведение при n→∞. На малых n младшие члены и константы решают: алгоритм с худшим классом роста, но малой константой (вставки) часто быстрее «умного». Поэтому гибридные сортировки (Timsort) переключаются на вставки для коротких кусков. Вывод «лучший класс = всегда быстрее» верен лишь начиная с некоторого n₀.
Почему сортировка сравнениями не может быть быстрее O(n log n) в худшем случае?
A)Из-за ограничений оперативной памятиB)Так исторически договорились программистыC)Потому что n log n — это и есть линейное времяD)Есть n! возможных перестановок, и дерево сравнений глубиной ≥ log(n!) ≈ n log nпоказать ответ и разбор
+D)Есть n! возможных перестановок, и дерево сравнений глубиной ≥ log(n!) ≈ n log n// разбор: Любая сортировка сравнениями различает n! перестановок входа. Каждое сравнение даёт 1 бит (двоичный исход), значит нужно минимум log₂(n!) сравнений. По формуле Стирлинга log₂(n!) ≈ n log n — это нижняя граница. Обойти её можно, лишь отказавшись от сравнений (counting/radix sort используют структуру ключей).
Проверить правильность расстановки скобок в строке «([]{})». Какая структура естественна?
A)Куча по приоритету, где каждой скобке присвоен свой числовой вес важностиB)Стек: открывающую кладём, закрывающую снимаем и сверяем паруC)Хеш-таблица частот символовD)Отсортированный массивпоказать ответ и разбор
+B)Стек: открывающую кладём, закрывающую снимаем и сверяем пару// разбор: Скобки — вложенная структура: последняя открытая должна закрыться первой, это чистый LIFO. Идём по строке: открывающую пушим в стек; встретив закрывающую — снимаем верх и проверяем, что это парная ей открывающая. В конце стек должен быть пуст. O(n) времени.
Обход графа/дерева «в ширину» (BFS) естественно реализуется с помощью...
A)очереди (FIFO): соседей в конец, обрабатываем с начала — по уровнямB)Стека (LIFO)C)Кучи по приоритетуD)Хеш-таблицы, которая сама по себе заменяет обход графа целикомпоказать ответ и разбор
+A)очереди (FIFO): соседей в конец, обрабатываем с начала — по уровням// разбор: BFS обходит вершины по слоям удаления от старта: очередь хранит фронт, мы вынимаем вершину, кладём её непосещённых соседей в конец. FIFO гарантирует, что ближние уровни обработаются раньше дальних — поэтому BFS находит кратчайший путь по числу рёбер в невзвешенном графе. Стек дал бы DFS (в глубину).
Признак «среднее число заказов юзера в день» посчитан по всей истории и приклеен к каждой обучающей строке. Модель предсказывает отток на месяц вперёд. В чём беда?
A)Среднее — слишком грубая статистика, нужна медиана по неделямB)Утечка из будущего: агрегат включает события после момента предсказания; фичи считают только по данным до негоC)Беды нет: агрегаты по юзеру безопасны — они описывают поведение самого человека, а не таргет конкретной обучающей строкиD)Признак дублирует таргет, его надо просто удалитьпоказать ответ и разбор
+B)Утечка из будущего: агрегат включает события после момента предсказания; фичи считают только по данным до него// разбор: Для строки «юзер в январе» агрегат по всей истории уже знает февраль и март — в том числе, ушёл ли юзер. Оффлайн-метрики взлетают, прод проваливается. Правильно: каждая строка получает фичи, посчитанные строго по данным до её момента предсказания — point-in-time корректность, ради которой фичсторы и городят time-travel join.
Почему L1-регуляризация (Lasso) зануляет часть весов, а L2 (Ridge) — только уменьшает их?
A)L1 штрафует большие веса заметно сильнее, чем L2, поэтому наименее полезные веса быстро затухают до полного нуляB)L2 несовместима с градиентным спуском, поэтому веса лишь плавно уменьшаютсяC)L1 применяется к признакам с низкой дисперсией и выкидывает остальныеD)У ограничения L1 есть «углы» на осях координат: оптимум часто попадает в вершину, где часть весов — нольпоказать ответ и разбор
+D)У ограничения L1 есть «углы» на осях координат: оптимум часто попадает в вершину, где часть весов — ноль// разбор: Геометрия: множество ограничений L1 — ромб с вершинами на осях, и линии уровня лосса чаще касаются его именно в вершине, где часть весов ровно ноль. У L2 ограничение — сфера без углов, поэтому веса сжимаются, но не зануляются. Отсюда Lasso как встроенный отбор признаков.
это девять из 76
Ещё 67 вопросов уровня Яндекс — внутри тренажёра.
Они входят в общий банк Сеньорчика: 2899 вопросов по 44 темам. Выбираете роль, тренируетесь ежедневными сессиями, а движок повторения возвращает темы, где вы плывёте, — как раз те, на которых валят секции. Начать можно бесплатно.