Две аналитические задачи с интервью «Яндекса»: разбор и практика на Python Academy
На позициях аналитиков данных (Data Analyst / Product Analyst) в «Яндексе» часто проверяют умение формализовать устную задачу, подобрать правильный математический инструмент и обосновать ответ.
Разберём две реальные задачи: «Конфетный алгоритм» на подсчёт и оптимизацию и «Доверяй, но проверяй» на условные вероятности.
Задача 1. «Конфетный алгоритм» — честно делим сладости
Условие задачи
На столе лежит n конфет, каждая принадлежит к какому‑то типу (вкусу). Все конфеты одинакового типа считаются идентичными.
Требуется раздать все конфеты максимальному числу друзей так, чтобы наборы у каждого получились строго одинаковыми: совпадают и типы, и количество каждого типа.
Верните целое число — максимальное число друзей. Если список пуст, верните 0.
Примеры
a, a, b, b — два «a» и два «b».
Раздается двум друзьям: каждый получает по одной a и одной b.
Ответ 2.x, x, x, y, y, y — по три x и y.
Делится на троих друзей, набор [x, y].
Ответ 3.m×4, n×6, o×8 — сначала кажется, что поделить не получится: количества 4, 6 и 8 не кратны друг другу.
Но число 2 делит каждое из них без остатка, поэтому максимальное — 2: каждому другу достанется по 2 m, 3 n, 4 o.
Ответ 2.
Попробуйте решить сами
👉 Задача №9 в тренажёре Python Academy — напишите код, пройдите автотесты, а затем возвращайтесь к разбору.
Почему здесь нужен наибольший общий делитель
Число друзей k должно ровно делить количество каждой разновидности конфет. Максимальное число, которое делит все эти количества без остатка, и есть наибольший общий делитель (НОД) этих чисел — поэтому именно НОД отвечает на вопрос задачи.
Как найти НОД на практике
Считаем частоты типов через обычный словарь: получаем набор чисел c₁, c₂, …, cₘ.
Применяем алгоритм Евклида: проходим по списку частот и последовательно вызываем gcd(a, b) — стандартную функцию Python из модуля math, которая выдаёт НОД двух чисел. Один проход — и получаем общий НОД для всех типов.
Используя стандартные библиотеки collections и functools, тот же алгоритм можно записать значительно короче:
Задача 2. «Доверяй, но проверяй» — условные вероятности
Условие задачи
Эту задачу правильно решают только 5 % кандидатов. Интервьюер в 2 % случаев принимает неверное решение за верное (при этом все действительно правильные решения он отличает без ошибок). Интервьюер говорит вам, что вы справились.
Какова вероятность, что вы действительно ответили правильно?
Перед тем как решать
Чтобы ответить, понадобится базовая теория вероятностей, а именно формула Байеса. Если вы никогда не сталкивались с ней, сначала взгляните на короткое объяснение: https://ru.wikipedia.org/wiki/Формула_Байеса.
Формула показывает, как пересчитать вероятность причины, когда наблюдаем следствие.
Последовательное решение
Шаг 1 — определяем события
C — «ответ правильный»;
¬C — «ответ неправильный»;
P — «интервьюер сказал “Pass” (зачёл ответ)».
Шаг 2 — исходные данные
P(C) = 0,05 (5 % кандидатов решают верно)
P(¬C) = 0,95
P(P | C) = 1 — интервьюер всегда распознаёт правильный ответ
P(P | ¬C) = 0,02 — в 2 % случаев он ошибочно зачтёт неверный ответ
Шаг 3 — формулируем цель
Найти условную вероятность P(C | P): каков шанс, что ответ верный, раз уж интервьюер сказал «Pass».
Шаг 4 — применяем формулу Байеса
Числитель: 1 × 0.05 = 0.05.
Знаменатель: 1 × 0.05 + 0.02 × 0.95 = 0.05 + 0.019 = 0.069.
Делим: 0.05 / 0.069 ≈ 0.7246
Итог — вероятность того, что вы действительно правы, ≈ 72,5 %.
Кроме того, на сайте Python Academy есть задачи с собеседований других крупных компаний. Заходите, решайте, и удачи на собеседованиях!