Files
javascript-interview/README.md
Николай Вигдоров 76024dd8b9 fill readme file
2025-10-18 10:14:05 +03:00

21 KiB
Raw Permalink Blame History

20 задач для подготовки к алгоритмическому собеседованию JavaScript

Уровень D (Базовый) - 1-4 задачи

Задача 1: Валидация email адресов в базе пользователей

Сложность: D
Проверяемые навыки:

  • Структура данных: Array (Массив)
  • Алгоритм: Линейный поиск с условием
  • Сложность: O(n) время, O(1) память

Описание:
У вас есть массив email-адресов пользователей. Нужно найти и вернуть все валидные email-адреса (содержат '@' и '.').

Прикладное применение: Очистка пользовательских данных перед отправкой рассылки.

// Входные данные
const emails = ["user@mail.com", "invalid.email", "test@domain.org", "bad@"];

// Ожидаемый результат
// ["user@mail.com", "test@domain.org"]

Задача 2: Подсчет частоты просмотров страниц

Сложность: D
Проверяемые навыки:

  • Структура данных: Hash Table (Map/Object)
  • Алгоритм: Хеширование
  • Сложность: O(n) время, O(k) память, где k - уникальные элементы

Описание:
Дан массив с URL страниц, которые посещал пользователь. Вернуть объект с количеством посещений каждой страницы.

Прикладное применение: Аналитика поведения пользователей на сайте.

// Входные данные
const visits = ["/home", "/about", "/home", "/contact", "/home"];

// Ожидаемый результат
// { "/home": 3, "/about": 1, "/contact": 1 }

Задача 3: Поиск пользователя по ID в отсортированном списке

Сложность: D+
Проверяемые навыки:

  • Структура данных: Sorted Array (Отсортированный массив)
  • Алгоритм: Binary Search (Бинарный поиск)
  • Сложность: O(log n) время, O(1) память

Описание:
Дан отсортированный массив ID пользователей. Найти индекс пользователя с заданным ID или вернуть -1.

Прикладное применение: Быстрый поиск в большой базе пользователей.

// Входные данные
const userIds = [101, 205, 309, 412, 518, 624];
const targetId = 412;

// Ожидаемый результат: 3

Задача 4: Удаление дубликатов из списка товаров

Сложность: D+
Проверяемые навыки:

  • Структура данных: Set (Множество)
  • Алгоритм: Использование хеш-структуры
  • Сложность: O(n) время, O(n) память

Описание:
Дан массив артикулов товаров, может содержать дубликаты. Вернуть массив уникальных артикулов в исходном порядке.

Прикладное применение: Очистка списка товаров в корзине.

// Входные данные
const products = ["SKU001", "SKU002", "SKU001", "SKU003", "SKU002"];

// Ожидаемый результат
// ["SKU001", "SKU002", "SKU003"]

Уровень C (Средний) - 5-9 задачи

Задача 5: Поиск пары товаров на заданную сумму

Сложность: C
Проверяемые навыки:

  • Структура данных: Hash Table
  • Алгоритм: Two Sum Pattern
  • Паттерн: Hash Map для комплементов
  • Сложность: O(n) время, O(n) память

Описание:
Дан массив цен товаров и бюджет покупателя. Найти индексы двух товаров, сумма которых равна бюджету.

Прикладное применение: Рекомендация товаров в интернет-магазине.

// Входные данные
const prices = [50, 120, 30, 80, 150];
const budget = 180;

// Ожидаемый результат: [1, 4] (120 + 60 = 180)

Задача 6: Максимальная выручка за период (скользящее окно)

Сложность: C
Проверяемые навыки:

  • Структура данных: Array
  • Алгоритм: Sliding Window (Скользящее окно)
  • Паттерн: Fixed Window
  • Сложность: O(n) время, O(1) память

Описание:
Дан массив ежедневной выручки магазина. Найти максимальную выручку за любые k последовательных дней.

Прикладное применение: Анализ продаж для определения лучшего периода.

// Входные данные
const dailyRevenue = [100, 200, 300, 400, 100];
const k = 3; // 3 дня

// Ожидаемый результат: 900 (дни 1-3: 200+300+400)

Задача 7: Проверка валидности скобок в коде

Сложность: C
Проверяемые навыки:

  • Структура данных: Stack (Стек)
  • Алгоритм: Matching Parentheses
  • Паттерн: Stack для парных элементов
  • Сложность: O(n) время, O(n) память

Описание:
Дана строка с различными скобками. Проверить, все ли скобки правильно закрыты и вложены.

Прикладное применение: Валидация синтаксиса кода в IDE.

// Входные данные
const code1 = "{[()]}";  // true
const code2 = "{[(])}";  // false

Задача 8: Реверс связного списка заказов

Сложность: C+
Проверяемые навыки:

  • Структура данных: Linked List (Связный список)
  • Алгоритм: In-place Reversal
  • Паттерн: Три указателя (prev, current, next)
  • Сложность: O(n) время, O(1) память

Описание:
Дан связный список заказов. Развернуть список так, чтобы последний заказ стал первым.

Прикладное применение: Изменение приоритета обработки заказов.

// Входные данные
// 1 -> 2 -> 3 -> 4 -> null

// Ожидаемый результат
// 4 -> 3 -> 2 -> 1 -> null

Задача 9: Поиск цикла в цепочке редиректов

Сложность: C+
Проверяемые навыки:

  • Структура данных: Linked List
  • Алгоритм: Floyd's Cycle Detection (Fast & Slow Pointers)
  • Паттерн: Два указателя разной скорости
  • Сложность: O(n) время, O(1) память

Описание:
Дана цепочка URL редиректов. Определить, есть ли циклический редирект (бесконечный цикл).

Прикладное применение: Проверка корректности настройки редиректов на сайте.

// Входные данные
// A -> B -> C -> D -> B (есть цикл)

// Ожидаемый результат: true

Уровень B (Продвинутый) - 10-14 задачи

Задача 10: Слияние интервалов рабочего времени

Сложность: B
Проверяемые навыки:

  • Структура данных: Array of Intervals
  • Алгоритм: Merge Intervals Pattern
  • Паттерн: Сортировка + слияние пересекающихся интервалов
  • Сложность: O(n log n) время, O(n) память

Описание:
Даны интервалы рабочих смен сотрудников. Объединить пересекающиеся смены для оптимизации расписания.

Прикладное применение: Составление графика работы и определение нагрузки.

// Входные данные
const shifts = [[1, 3], [2, 6], [8, 10], [9, 12], [15, 18]];

// Ожидаемый результат
// [[1, 6], [8, 12], [15, 18]]

Задача 11: Обход дерева категорий товаров (BFS)

Сложность: B
Проверяемые навыки:

  • Структура данных: Tree (Дерево)
  • Алгоритм: Breadth-First Search (BFS)
  • Паттерн: Level-order traversal с очередью
  • Сложность: O(n) время, O(w) память, где w - ширина дерева

Описание:
Дано дерево категорий товаров. Вывести все категории по уровням (сначала главные, затем подкатегории).

Прикладное применение: Построение навигационного меню магазина.

// Входные данные
//       Электроника
//      /           \
//   Ноутбуки    Телефоны
//   /     \        |
// Apple  Dell   Samsung

// Ожидаемый результат
// [["Электроника"], ["Ноутбуки", "Телефоны"], ["Apple", "Dell", "Samsung"]]

Задача 12: Поиск похожих товаров (DFS)

Сложность: B
Проверяемые навыки:

  • Структура данных: Tree/Graph
  • Алгоритм: Depth-First Search (DFS)
  • Паттерн: Рекурсивный обход дерева
  • Сложность: O(n) время, O(h) память, где h - высота

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

Прикладное применение: Система рекомендаций "Похожие товары".

// Найти все товары в подкатегории "Ноутбуки"

Задача 13: K самых популярных товаров

Сложность: B+
Проверяемые навыки:

  • Структура данных: Heap (Min-Heap)
  • Алгоритм: Top K Elements Pattern
  • Паттерн: Использование кучи для K наибольших элементов
  • Сложность: O(n log k) время, O(k) память

Описание:
Дан список товаров с количеством покупок. Найти K самых популярных товаров.

Прикладное применение: Блок "Хиты продаж" на главной странице.

// Входные данные
const purchases = {
  "iPhone": 150,
  "Samsung": 120,
  "Xiaomi": 200,
  "Huawei": 80
};
const k = 2;

// Ожидаемый результат
// ["Xiaomi", "iPhone"]

Задача 14: Объединение отсортированных списков товаров

Сложность: B+
Проверяемые навыки:

  • Структура данных: Multiple Sorted Lists + Heap
  • Алгоритм: K-way Merge Pattern
  • Паттерн: Min-Heap для слияния k списков
  • Сложность: O(n log k) время, где n - всего элементов

Описание:
Даны отсортированные списки товаров от разных поставщиков. Объединить в один отсортированный список.

Прикладное применение: Агрегация товаров от нескольких поставщиков.

// Входные данные
const supplier1 = [10, 50, 100];
const supplier2 = [20, 40, 80];
const supplier3 = [5, 35, 90];

// Ожидаемый результат
// [5, 10, 20, 35, 40, 50, 80, 90, 100]

Уровень A (Экспертный) - 15-20 задачи

Задача 15: Максимальная прибыль от продажи акций

Сложность: A-
Проверяемые навыки:

  • Структура данных: Array
  • Алгоритм: Dynamic Programming (Kadane's Algorithm вариант)
  • Паттерн: DP с отслеживанием минимума
  • Сложность: O(n) время, O(1) память

Описание:
Дан массив цен акций по дням. Найти максимальную прибыль от одной покупки и продажи.

Прикладное применение: Анализ торговых стратегий.

// Входные данные
const prices = [7, 1, 5, 3, 6, 4];

// Ожидаемый результат: 5 (купить за 1, продать за 6)

Задача 16: Количество способов доставки заказа

Сложность: A-
Проверяемые навыки:

  • Структура данных: Array для DP-таблицы
  • Алгоритм: Dynamic Programming (Climbing Stairs вариант)
  • Паттерн: Bottom-up DP
  • Сложность: O(n) время, O(n) или O(1) память

Описание:
Курьер может доставить 1 или 2 заказа за раз. Найти количество способов доставить n заказов.

Прикладное применение: Оптимизация логистики доставки.

// Входные данные
const n = 5; // 5 заказов

// Ожидаемый результат: 8 способов
// (1+1+1+1+1, 2+1+1+1, 1+2+1+1, 1+1+2+1, 1+1+1+2, 2+2+1, 2+1+2, 1+2+2)

Задача 17: Поиск подстроки продуктов (генерация подмножеств)

Сложность: A
Проверяемые навыки:

  • Структура данных: Array
  • Алгоритм: Backtracking (Subsets Pattern)
  • Паттерн: Рекурсивная генерация всех подмножеств
  • Сложность: O(2^n) время, O(n) память (стек рекурсии)

Описание:
Дан набор характеристик товара. Сгенерировать все возможные комбинации характеристик для фильтров.

Прикладное применение: Генерация всех вариантов фильтров в каталоге.

// Входные данные
const features = ["цвет", "размер", "материал"];

// Ожидаемый результат
// [[], ["цвет"], ["размер"], ["материал"], 
//  ["цвет", "размер"], ["цвет", "материал"], 
//  ["размер", "материал"], ["цвет", "размер", "материал"]]

Задача 18: Поиск кратчайшего пути доставки

Сложность: A
Проверяемые навыки:

  • Структура данных: Graph (Граф)
  • Алгоритм: BFS для невзвешенного графа / Dijkstra для взвешенного
  • Паттерн: Обход графа с отслеживанием расстояний
  • Сложность: O(V + E) время для BFS, O((V + E) log V) для Dijkstra

Описание:
Дана карта города (граф) с пунктами выдачи. Найти кратчайший путь от склада до клиента.

Прикладное применение: Оптимизация маршрутов курьерской доставки.

// Входные данные
const cityMap = {
  "Склад": [ункт1", ункт2"],
  ункт1": [ункт3"],
  ункт2": [ункт3", "Клиент"],
  ункт3": ["Клиент"]
};

// Найти кратчайший путь от "Склад" до "Клиент"
// Ожидаемый результат: ["Склад", "Пункт2", "Клиент"]

Задача 19: Определение порядка сборки продукта

Сложность: A+
Проверяемые навыки:

  • Структура данных: Directed Graph (Ориентированный граф)
  • Алгоритм: Topological Sort (Kahn's Algorithm или DFS)
  • Паттерн: Обработка зависимостей
  • Сложность: O(V + E) время, O(V) память

Описание:
Даны этапы сборки продукта с зависимостями. Определить правильный порядок выполнения этапов.

Прикладное применение: Планирование производственного процесса.

// Входные данные
const stages = ["подготовка", "сборка", "упаковка", "отгрузка"];
const dependencies = [
  ["подготовка", "сборка"],
  ["сборка", "упаковка"],
  ["упаковка", "отгрузка"]
];

// Ожидаемый результат
// ["подготовка", "сборка", "упаковка", "отгрузка"]

Задача 20: Оптимальное распределение задач между серверами

Сложность: A+
Проверяемые навыки:

  • Структура данных: Array + Heap
  • Алгоритм: Dynamic Programming + Greedy + Two Heaps
  • Паттерн: Минимизация максимальной нагрузки
  • Сложность: O(n log n) время, O(n) память

Описание:
Даны задачи с временем выполнения и k серверов. Распределить задачи так, чтобы минимизировать максимальное время работы любого сервера.

Прикладное применение: Балансировка нагрузки в облачной инфраструктуре.

// Входные данные
const tasks = [3, 5, 2, 7, 4, 1]; // время выполнения в минутах
const servers = 3;

// Ожидаемый результат
// Сервер 1: [7, 1] = 8 минут
// Сервер 2: [5, 3] = 8 минут
// Сервер 3: [4, 2] = 6 минут
// Максимальное время: 8 минут

Рекомендации по подготовке

План изучения:

  1. Неделя 1-2: Задачи D уровня (освоение базовых структур)
  2. Неделя 3-4: Задачи C уровня (паттерны Two Pointers, Sliding Window, Stack)
  3. Неделя 5-6: Задачи B уровня (Trees, Heaps, продвинутые паттерны)
  4. Неделя 7-8: Задачи A уровня (DP, Graphs, комплексные задачи)

Ключевые структуры данных для приоритетного изучения:

Критичные: Array, Hash Table, Stack, Queue
Важные: Linked List, Binary Tree, Heap
Продвинутые: Graph, Trie

Основные паттерны (в порядке важности):

  1. Two Pointers / Sliding Window
  2. Hash Table для быстрого поиска
  3. BFS/DFS для деревьев и графов
  4. Dynamic Programming
  5. Binary Search
  6. Backtracking

Полезные ресурсы:

  • LeetCode: Практика задач по паттернам
  • NeetCode: Видеоразборы популярных задач
  • GreatFrontEnd: Специально для фронтенд-разработчиков
  • Educative - Grokking the Coding Interview: Систематизированный курс

Совет: Решайте задачи по паттернам, а не в случайном порядке. После каждой задачи записывайте паттерн и подход к решению в свой конспект.