Алгоритмы с нуля
Списки, стеки, очереди: тест с выбором
Шесть вопросов через весь юнит. Каждый — это решение, на которое давит интервьюер: не определение для пересказа, а cost model, которую надо защитить, и выбор реализации, который надо обосновать.
Убедись, что умеешь связать раскладку linked list в памяти с его cost model, рассуждать о манипуляции pointer не теряя узлов, выбирать правильную дисциплину LIFO/FIFO под задачу и объяснять, почему monotonic stack линеен несмотря на внутренний цикл.
Нагрузка делает push в голову 10 000 раз, а затем 100 раз читает по индексу в случайных позициях. Надо выбрать array vs singly linked list. Что быстрее в сумме и почему?
Ты пишешь in-place разворот singly linked list. Коллега пишет внутри цикла current.next = prev; current = current.next;. Что ломается?
Ты постоянно вставляешь и удаляешь в голове singly linked list и всё время натыкаешься на null-pointer спецслучаи для пустого списка и позиции головы. Какой самый чистый структурный фикс?
Ты валидируешь вложенные скобки в парсере конфигов и отдельно делаешь обход дерева в порядке уровней (в ширину). Какие структуры подходят и почему?
Ты реализуешь FIFO queue на массиве JavaScript: push для enqueue и shift для dequeue. Под устойчивым потоком из N пар enqueue+dequeue какова суммарная стоимость и фикс?
Решение next-greater-element на monotonic stack имеет цикл while внутри for, но это O(n), а не O(n^2). В чём точный аргумент?
Сквозная линия юнита — одна cost model и три дисциплины. Раскладка в памяти задаёт стоимость: непрерывность покупает O(1)-индексацию, разбросанность — O(1)-вставку в голову; выбираешь по доминирующей операции. Манипуляция pointer — это сохранять связи до перезаписи и использовать sentinel, чтобы стереть спецслучаи головы. Stack (LIFO) и queue (FIFO) — это дисциплины, а не структуры данных: выбирай по тому, нужен ли тебе последний-первым или порядок прибытия, и никогда не делай dequeue через shift. Monotonic stack — это выигрыш: stack плюс инвариант порядка превращают O(n^2)-скан в O(n) по аргументу push-once/pop-once.