diff --git a/README.md b/README.md index e69de29..56c41cc 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,514 @@ +# 20 задач для подготовки к алгоритмическому собеседованию JavaScript + +## Уровень D (Базовый) - 1-4 задачи + +### Задача 1: Валидация email адресов в базе пользователей +**Сложность:** D +**Проверяемые навыки:** +- Структура данных: Array (Массив) +- Алгоритм: Линейный поиск с условием +- Сложность: O(n) время, O(1) память + +**Описание:** +У вас есть массив email-адресов пользователей. Нужно найти и вернуть все валидные email-адреса (содержат '@' и '.'). + +**Прикладное применение:** Очистка пользовательских данных перед отправкой рассылки. + +```javascript +// Входные данные +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 страниц, которые посещал пользователь. Вернуть объект с количеством посещений каждой страницы. + +**Прикладное применение:** Аналитика поведения пользователей на сайте. + +```javascript +// Входные данные +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. + +**Прикладное применение:** Быстрый поиск в большой базе пользователей. + +```javascript +// Входные данные +const userIds = [101, 205, 309, 412, 518, 624]; +const targetId = 412; + +// Ожидаемый результат: 3 +``` + +--- + +### Задача 4: Удаление дубликатов из списка товаров +**Сложность:** D+ +**Проверяемые навыки:** +- Структура данных: Set (Множество) +- Алгоритм: Использование хеш-структуры +- Сложность: O(n) время, O(n) память + +**Описание:** +Дан массив артикулов товаров, может содержать дубликаты. Вернуть массив уникальных артикулов в исходном порядке. + +**Прикладное применение:** Очистка списка товаров в корзине. + +```javascript +// Входные данные +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) память + +**Описание:** +Дан массив цен товаров и бюджет покупателя. Найти индексы двух товаров, сумма которых равна бюджету. + +**Прикладное применение:** Рекомендация товаров в интернет-магазине. + +```javascript +// Входные данные +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 последовательных дней. + +**Прикладное применение:** Анализ продаж для определения лучшего периода. + +```javascript +// Входные данные +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. + +```javascript +// Входные данные +const code1 = "{[()]}"; // true +const code2 = "{[(])}"; // false +``` + +--- + +### Задача 8: Реверс связного списка заказов +**Сложность:** C+ +**Проверяемые навыки:** +- Структура данных: Linked List (Связный список) +- Алгоритм: In-place Reversal +- Паттерн: Три указателя (prev, current, next) +- Сложность: O(n) время, O(1) память + +**Описание:** +Дан связный список заказов. Развернуть список так, чтобы последний заказ стал первым. + +**Прикладное применение:** Изменение приоритета обработки заказов. + +```javascript +// Входные данные +// 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 редиректов. Определить, есть ли циклический редирект (бесконечный цикл). + +**Прикладное применение:** Проверка корректности настройки редиректов на сайте. + +```javascript +// Входные данные +// A -> B -> C -> D -> B (есть цикл) + +// Ожидаемый результат: true +``` + +--- + +## Уровень B (Продвинутый) - 10-14 задачи + +### Задача 10: Слияние интервалов рабочего времени +**Сложность:** B +**Проверяемые навыки:** +- Структура данных: Array of Intervals +- Алгоритм: Merge Intervals Pattern +- Паттерн: Сортировка + слияние пересекающихся интервалов +- Сложность: O(n log n) время, O(n) память + +**Описание:** +Даны интервалы рабочих смен сотрудников. Объединить пересекающиеся смены для оптимизации расписания. + +**Прикладное применение:** Составление графика работы и определение нагрузки. + +```javascript +// Входные данные +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 - ширина дерева + +**Описание:** +Дано дерево категорий товаров. Вывести все категории по уровням (сначала главные, затем подкатегории). + +**Прикладное применение:** Построение навигационного меню магазина. + +```javascript +// Входные данные +// Электроника +// / \ +// Ноутбуки Телефоны +// / \ | +// Apple Dell Samsung + +// Ожидаемый результат +// [["Электроника"], ["Ноутбуки", "Телефоны"], ["Apple", "Dell", "Samsung"]] +``` + +--- + +### Задача 12: Поиск похожих товаров (DFS) +**Сложность:** B +**Проверяемые навыки:** +- Структура данных: Tree/Graph +- Алгоритм: Depth-First Search (DFS) +- Паттерн: Рекурсивный обход дерева +- Сложность: O(n) время, O(h) память, где h - высота + +**Описание:** +Дано дерево связанных товаров. Найти все товары в категории, используя глубинный поиск. + +**Прикладное применение:** Система рекомендаций "Похожие товары". + +```javascript +// Найти все товары в подкатегории "Ноутбуки" +``` + +--- + +### Задача 13: K самых популярных товаров +**Сложность:** B+ +**Проверяемые навыки:** +- Структура данных: Heap (Min-Heap) +- Алгоритм: Top K Elements Pattern +- Паттерн: Использование кучи для K наибольших элементов +- Сложность: O(n log k) время, O(k) память + +**Описание:** +Дан список товаров с количеством покупок. Найти K самых популярных товаров. + +**Прикладное применение:** Блок "Хиты продаж" на главной странице. + +```javascript +// Входные данные +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 - всего элементов + +**Описание:** +Даны отсортированные списки товаров от разных поставщиков. Объединить в один отсортированный список. + +**Прикладное применение:** Агрегация товаров от нескольких поставщиков. + +```javascript +// Входные данные +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) память + +**Описание:** +Дан массив цен акций по дням. Найти максимальную прибыль от одной покупки и продажи. + +**Прикладное применение:** Анализ торговых стратегий. + +```javascript +// Входные данные +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 заказов. + +**Прикладное применение:** Оптимизация логистики доставки. + +```javascript +// Входные данные +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) память (стек рекурсии) + +**Описание:** +Дан набор характеристик товара. Сгенерировать все возможные комбинации характеристик для фильтров. + +**Прикладное применение:** Генерация всех вариантов фильтров в каталоге. + +```javascript +// Входные данные +const features = ["цвет", "размер", "материал"]; + +// Ожидаемый результат +// [[], ["цвет"], ["размер"], ["материал"], +// ["цвет", "размер"], ["цвет", "материал"], +// ["размер", "материал"], ["цвет", "размер", "материал"]] +``` + +--- + +### Задача 18: Поиск кратчайшего пути доставки +**Сложность:** A +**Проверяемые навыки:** +- Структура данных: Graph (Граф) +- Алгоритм: BFS для невзвешенного графа / Dijkstra для взвешенного +- Паттерн: Обход графа с отслеживанием расстояний +- Сложность: O(V + E) время для BFS, O((V + E) log V) для Dijkstra + +**Описание:** +Дана карта города (граф) с пунктами выдачи. Найти кратчайший путь от склада до клиента. + +**Прикладное применение:** Оптимизация маршрутов курьерской доставки. + +```javascript +// Входные данные +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) память + +**Описание:** +Даны этапы сборки продукта с зависимостями. Определить правильный порядок выполнения этапов. + +**Прикладное применение:** Планирование производственного процесса. + +```javascript +// Входные данные +const stages = ["подготовка", "сборка", "упаковка", "отгрузка"]; +const dependencies = [ + ["подготовка", "сборка"], + ["сборка", "упаковка"], + ["упаковка", "отгрузка"] +]; + +// Ожидаемый результат +// ["подготовка", "сборка", "упаковка", "отгрузка"] +``` + +--- + +### Задача 20: Оптимальное распределение задач между серверами +**Сложность:** A+ +**Проверяемые навыки:** +- Структура данных: Array + Heap +- Алгоритм: Dynamic Programming + Greedy + Two Heaps +- Паттерн: Минимизация максимальной нагрузки +- Сложность: O(n log n) время, O(n) память + +**Описание:** +Даны задачи с временем выполнения и k серверов. Распределить задачи так, чтобы минимизировать максимальное время работы любого сервера. + +**Прикладное применение:** Балансировка нагрузки в облачной инфраструктуре. + +```javascript +// Входные данные +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:** Систематизированный курс + +**Совет:** Решайте задачи по паттернам, а не в случайном порядке. После каждой задачи записывайте паттерн и подход к решению в свой конспект. \ No newline at end of file