Практические задачи
Практические задачи на собеседовании редко про хитрую математику — почти всегда они про то, знаете ли вы правильный приём и его цену по времени и памяти. Убрать дубликаты через Set за O(n), а не через indexOf в цикле за O(n²); развернуть строку, помня, что она неизменяема; остановить рекурсию базовым случаем; собрать текучую цепочку через return this. Это не разные задачи, а горстка повторяющихся шаблонов.
Отдельный класс вопросов — «что выведет этот код»: там проверяют не приём, а понимание правил приведения типов, порядка событийного цикла и привязки this. Ниже каждый слой разбирает один приём или один класс ловушек — от массивов до жизненного цикла DOM-событий.
Карта темы
- Алгоритмы на массивах — дедупликация через
Set, проверка принадлежности за O(1) и почемуindexOfв цикле превращает задачу в O(n²). - Алгоритмы на строках — неизменяемость строк, разворот через
[...s].reverse().join('')и приём двух указателей для палиндрома за O(1) памяти. - Рекурсивные алгоритмы — базовый и рекурсивный случай, спуск в структуру любой глубины и переполнение стека без базового случая.
- Цепочки методов —
return thisдля текучего API, завершающий аксессор и приватное состояние через замыкание. - Утилиты на замыканиях — фабрики с приватным состоянием,
debounce/throttleи каррирование, где замыкание хранит накопленные данные. - Предсказание вывода — как разбирать «что выведет» по правилам приведения, порядка событийного цикла и привязки
this. - Трюк с XOR — свойства побитового XOR и как они дают решение за O(1) памяти для задачи об одиночном числе.
- Жизненный цикл DOM-событий — событийная загрузка ресурсов, навешивание
onload/onerrorдоsrcи ловушка закэшированной картинки.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Дедупликация через indexOf в цикле | Скрытая сложность O(n²) вместо O(n) с Set |
| Сортировка ради дедупликации | Разрушен исходный порядок первого появления |
Вызвать reverse прямо на строке | Ошибка — метод есть только у массивов, строки неизменяемы |
| Рекурсия без базового случая | Бесконечный спуск и RangeError переполнения стека |
Вернуть значение вместо this из цепочечного метода | Следующий вызов в цепочке падает |
Забыть clearTimeout в debounce | Срабатывает каждый вызов, а не только последний |
Читать img.complete сразу после src | Загрузка событийна, а не синхронна — результат не готов |
Ждать порядок setTimeout раньше Promise.then | Микрозадачи опустошаются целиком до любой макрозадачи |
Значение для собеседований
Кодинг-задачи проверяют, отличаете ли вы «работает» от «работает за нужную сложность» и владеете ли повторяющимися приёмами, а не решаете каждую задачу с нуля. Кандидат, который вслух называет цену решения («здесь Set даёт O(n) вместо O(n²) у indexOf»), сразу выглядит сильнее того, кто просто написал первый пришедший в голову цикл.
Что обычно проверяют:
- Знаете ли базовые приёмы —
Setдля уникальности, два указателя, рекурсию,return thisдля цепочек. - Называете ли сложность по времени и памяти и умеете ли её улучшить.
- Разбираете ли «что выведет» по правилам языка, а не угадыванием.
- Понимаете ли, что строки неизменяемы, а загрузка ресурсов событийна.
Типичный неверный ответ: «уникальные значения — это отсортировать и убрать соседние повторы». Сортировка стоит O(n log n) и разрушает исходный порядок; Set решает ту же задачу за O(n) с сохранением порядка первого появления.