Кодинг на Python
Секция кодинга у аналитика — это не Leetcode на 300 строк, а короткие задачи на чистом Python: посчитать, отфильтровать, сгруппировать, оценить сложность. Проверяют, умеете ли вы за один проход обойти список, выбрать правильную структуру данных (словарь, множество) и назвать Big-O своего решения вслух.
Ловушки здесь мелкие, но дорогие: > там, где нужно >=; знаменатель, из которого выпали нулевые пользователи; «наибольшее произведение», где два отрицательных дают положительное. Ниже — восемь приёмов, из которых складываются почти все такие задачи: от одного скана по массиву до динамического программирования.
Карта темы
- Оценка сложности (Big-O) — язык, которым описывают, как время и память растут с размером входа.
- Проход по массиву — один линейный скан с проверкой соседей вместо сортировки или вложенных циклов.
- Агрегация списка —
sum/countпо условию, булевы как 0/1 и ловушка порога>=. - Делимость и остаток — оператор
%, проверка обоих направлений и защита от деления на ноль. - Свойства цифр — разбор числа на цифры и предикат по каждой цифре, а не по всему числу.
- Группировка через словарь — раскладка по канонической ключу-сигнатуре вместо попарного сравнения.
- Метрика ARPU — суммарная ценность на число пользователей и ловушка знаменателя.
- Динамическое программирование — рекуррента «взять или пропустить» со скользящим состоянием.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
> вместо >= при подсчёте по порогу | Теряются элементы, точно равные порогу |
| Исключать нулевых пользователей из знаменателя ARPU | Завышенная средняя выручка — это уже ARPPU, а не ARPU |
| «Наибольшее произведение» = только два наибольших | Два больших отрицательных дают больший положительный результат |
Читать «честно чётное» как value % 2 == 0 | Проверять надо каждую цифру, а не чётность всего числа |
| Группировать анаграммы по длине или первой букве | Коллизии — несвязанные слова попадают в одну корзину |
| Жадно брать наибольшие дома в задаче о несоседних | Жадность неоптимальна — нужна рекуррента «взять/пропустить» |
Значение для собеседований
Здесь смотрят не на экзотические алгоритмы, а на аккуратность и словарь сложности. Кандидат, который пишет решение за один проход и сразу говорит «это O(n) по времени, O(1) по памяти, потому что...», проходит секцию, даже если синтаксис не идеален.
Что обычно проверяют:
- Умеете ли вы обойтись одним линейным проходом там, где новичок тянется к сортировке или вложенному циклу.
- Знаете ли Big-O своего решения и понимаете разницу между O(n) и O(n log n).
- Ловите ли граничные случаи — пустой список, ноль, совпадения, отрицательные.
- Выбираете ли структуру данных под задачу — словарь для группировки, множество для быстрой проверки принадлежности.
Типичный неверный ответ: решить задачу «в лоб» за O(n²) и не заметить, что тот же результат достижим за один проход, — или назвать сложность наугад, не связав её с числом проходов по данным.