Перейти к содержанию

Задачи с собеседований

Подборка классических задач с собеседований, LeetCode и CodeWars, сгруппированных по структуре данных, которую они закрепляют. Если в DSA-лабах lab00lab11 структуры реализуются «с нуля» без встроенных функций, то здесь мы их применяем — на готовых dict, set, list. Это разные режимы: в лабе важно понять, как устроена хеш-таблица, а тут — как ей пользоваться, чтобы свести перебор O(n²) к одному проходу.

Решения лежат в src/python/tasks/interview/, тесты — в tests/tasks/interview/. У части задач есть Go-версии в модуле src/golang/tasks/ (пакет interview, тесты рядом с кодом — гоняются через make go-test). Структура зеркальная и однозначная: каждой задаче из колонки Модуль соответствует ровно один файл решения src/python/tasks/interview/<модуль>.py и один файл тестов tests/tasks/interview/test_<модуль>.py. Каждый модуль в docstring помечен строкой «Закрепляет: labNN» и оценкой сложности. Запуск тестов — обычным make py-test (или uv run pytest tests/tasks/interview).

Как пользоваться

Сначала попробуйте решить задачу сами, опираясь на структуру из соответствующей лабы, и только потом сверьтесь с разбором. Ценность не в «знать ответ», а в том, чтобы видеть: «здесь повторяющийся поиск → нужен словарь», «здесь отсортированный массив → два указателя», «здесь ждём более позднее событие → стек».

Хеш-таблица → lab05

Словарь и множество дают проверку принадлежности и подсчёт за O(1) — это превращает вложенные циклы в один проход. Самый частый приём на собеседованиях.

Задача Идея Сложность Модуль
Есть ли дубликаты множество «уже виденных» O(n) / O(n) contains_duplicate
Two Sum словарь «значение → индекс», ищем дополнение O(n) / O(n) two_sum
Пересечение массивов частоты меньшего массива, вычёркиваем по большему O(n+m) / O(min) array_intersection
Первый уникальный символ частотный словарь + второй проход O(n) / O(k) first_unique_char
Анаграмма сравнение частотных словарей вместо сортировки O(n) / O(k) valid_anagram
Макс. серия повторов максимум длины серии по символу O(n) / O(k) max_consecutive_repeats
Объединение N массивов множество уникальных + сортировка результата O(n + k log k) / O(k) union_all_ints

Массив, стек и два указателя → lab01

Работа на месте (O(1) памяти), движение указателей по отсортированному массиву и стек «ожидающих» элементов.

Задача Идея Сложность Модуль
Пропущенное число сумма по Гауссу минус сумма массива O(n) / O(1) missing_number
Удалить дубли (sorted) указатель записи write, in-place O(n) / O(1) remove_duplicates
Сдвиг массива на k тройной разворот in-place O(n) / O(1) rotate_array
Two Sum (sorted) два указателя с краёв O(n) / O(1) two_sum_sorted
Сколько дней до тепла монотонный стек индексов O(n) / O(n) daily_temperatures
Переместить нули в конец указатель записи, in-place O(n) / O(1) move_zeroes
Развернуть строку два указателя навстречу O(n) / O(1) reverse_string

Поиск → lab04

Опора на отсортированность входа: указатели сходятся к ответу без полного перебора.

Задача Идея Сложность Модуль
Общее число в 3 массивах три указателя, двигаем минимальный O(n1+n2+n3) / O(1) common_in_three
k ближайших к элементу расхождение от позиции влево/вправо O(k log k) / O(k) k_closest

Биты и арифметика

Приёмы, не требующие отдельной структуры: разряды и свойства XOR.

Задача Идея Сложность Модуль
Прибавить единицу перенос разряда «в столбик» O(n) / O(1) plus_one
Одиночка среди пар XOR схлопывает пары O(n) / O(1) single_number
Второй максимум один проход, два «призёра» (по уникальным) O(n) / O(1) second_max

Про second_max

В исходной формулировке часто пишут «за один проход», но решают через sorted(arr)[-2] — это и не один проход, и неверно при дубликатах ([5, 5, 4] должно дать 4, а не 5). В репозитории задача переписана как честный O(n) поиск второго уникального максимума с двумя переменными-инвариантами.

Что можно добавить дальше

Курированный набор закрывает структуры из академических лаб. За кадром остались кластеры, которые ложатся не на лабы, а на тему строк/regex и на новые темы, — их можно добавить отдельной партией:

  • Строки — палиндром, общий префикс, strStr, atoi, reverse integer, генератор хештегов (тема 11, regex и разбор текста).
  • Матрицы 2D — валидный судоку, поворот картинки на 90°.
  • Динамика на сетке — число путей робота, треугольник Паскаля.