Знание этих 5 задач = минимум для прохождения Junior-собеса в Яндекс/Ozon. Они тренируют распознавание паттернов: hash map, stack, two pointers, binary search.
На Middle ждут, что ты различаешь O(n log n) heap-подход и O(n) bucket для Top-K, знаешь когда LRU через OrderedDict, а когда вручную через двусвязный список + hash map.
На Senior спрашивают design-задачи: реализуй LRU Cache, MedianFinder. Важно объяснить trade-off (память vs скорость, simplicity vs performance).
На любой алго-задаче спросят сложность time и space. Знай разницу между worst case, average case, amortized analysis.
| Нотация | Название | Примеры |
|---|---|---|
| O(1) | Константная | hash map insert/lookup |
| O(log n) | Логарифмическая | binary search, heap insert |
| O(n) | Линейная | один проход по массиву |
| O(n log n) | Линейно-логарифм. | merge sort, quick sort avg |
| O(n²) | Квадратичная | два вложенных цикла, bubble sort |
| O(2^n) | Экспоненциальная | recursion без memoization |
Если ты освоил эти 10 паттернов — справишься с 80% собесных задач. На задачу смотришь и распознаёшь «это типа sliding window» или «это типа Top-K через heap».
Классическая Middle-задача. Дан массив чисел, найди k самых частых элементов. Два подхода — heap O(n log k) и bucket O(n). На собесе ожидают что ты предложишь оба и обоснуешь trade-off.
from collections import Counter
import heapq
def topKFrequent(nums, k):
# Подход 1: heap O(n log k)
count = Counter(nums)
return heapq.nlargest(k, count.keys(), key=count.get)
def topKFrequent_bucket(nums, k):
# Подход 2: bucket sort O(n)
count = Counter(nums)
buckets = [[] for _ in range(len(nums) + 1)]
for num, freq in count.items():
buckets[freq].append(num)
result = []
for i in range(len(buckets) - 1, -1, -1):
result.extend(buckets[i])
if len(result) >= k:
return result[:k]
return result
Помни эти константы — на собесе спросят: «какая сложность dict.get?». Заодно поможет выбирать правильную структуру.
| Структура | Lookup | Insert | Delete |
|---|---|---|---|
| list (по индексу) | O(1) | O(n) (вставка не в конец) | O(n) |
| list (поиск) | O(n) | O(1) append | O(n) |
| set / dict | O(1) avg | O(1) avg | O(1) avg |
| deque | O(1) с концов | O(1) appendleft/append | O(1) popleft/pop |
| heap (heapq) | O(1) min | O(log n) | O(log n) |
Решай по 1-2 задачи в день на свежую голову. После решения смотри 2-3 чужих подхода — учись паттернам, а не зубри код. На собесе важнее озвучить approach и распознать паттерн, чем сразу написать идеально.
Да, на Middle+ позиции в Яндекс, Ozon, Авито, Тинькофф. На Junior могут быть 1-2 простые задачи (Two Sum, Binary Search). На Senior — design-задачи (LRU Cache, MedianFinder). На Lead/Staff алгоритмы могут заменить на system design.
У нас в тренажёре есть 100+ задач в Coderun-формате (Условие → Формат входа/выхода → Примеры → Ограничения). Можно сразу решать в браузере через Pyodide. Также есть официальный coderun.yandex.ru с возможностью прогнать решение бесплатно.
Топ-7: 1) hash map (Two Sum) — 80% собесов. 2) Sliding window — 70%. 3) Binary Search — 60%. 4) Two pointers — 60%. 5) BFS/DFS на графах — 50% Middle+. 6) DP — 40% Middle+. 7) Top-K / Heap — 40% Middle+.
С нуля: 2-3 месяца, по 1-2 задаче в день (60-100 задач). С опытом: 1 месяц повторения + новые паттерны. Перед собесом — 3-5 mock-интервью с алго-задачами.
Да, обязательно. Спросят сложность каждого решения — O(n), O(n log n), O(n²). Также amortized analysis (hash map insert O(1) amortized) и space complexity. Знай разницу между worst и average case.
1) «Грокаем алгоритмы» Адитья Бхаргава (визуально, для новичков). 2) «Алгоритмы. Построение и анализ» Кормен (классика). 3) Cracking the Coding Interview (паттерны интервью). 4) Open-source разборы задач на GitHub — лучший практический ресурс.
Junior: 50-80 простых задач (easy + первые medium). Middle: 150-200 (mix easy/medium/hard, фокус на medium). Senior: 300+ задач включая design (LRU, MedianFinder, Trie). Главное: разные паттерны, не однотипные задачи.
Подход. На собесе оценивают как ты думаешь: распознал ли паттерн, можешь ли обосновать сложность, видишь ли trade-off. Не успел дописать — не страшно, если объяснил подход. Молчал 10 минут — провал даже если написал идеально.
Да, в Python — sorted() / list.sort() (Timsort O(n log n)) приемлемы. Спросят: «а как ты сам напишешь sort?» — должен знать merge sort или quick sort. Не пытайся писать heap sort вручную если можно heapq.
Шаг 1: проговори условие вслух, нарисуй пример на бумаге. Шаг 2: предложи brute force подход, оцени сложность. Шаг 3: подумай как ускорить (hash map? sorted? two pointers?). Шаг 4: если не идёт за 30 мин — попроси подсказку. Это ОК для обучения, но не на реальном собесе.