Клеман Михайлеску провёл тестовое техническое интервью с 19-летним канадским студентом Тимом, известным по YouTube-каналу Tech with Tim. Тим готовился к собеседованиям в крупные ИТ-компании в течение трёх недель и решил около 50 задач на платформе AlgoExpert.
📅 Задача: поиск свободного времени в календарях 3:09
Интервьюер предложил написать алгоритм для поиска общих свободных слотов в графиках двух сотрудников . Входящие данные представлены в виде списков занятых интервалов, например, с 12:00 до 13:00 и с 15:00 до 16:30 . Дополнительно учитываются «дневные границы» — время начала и окончания рабочего дня, раньше или позже которых встречи проводить нельзя .
Условия задачи включают следующие параметры:
- Время передаётся в виде строк в 24-часовом (военном) формате.
- Календари изначально отсортированы по времени начала встреч .
- Длительность искомого окна может быть любой (например, 30 минут или 1 час).
- Если одна встреча заканчивается в 11:30, а следующая начинается в 11:30, это считается допустимым переходом .
💡 Выработка стратегии решения 7:53
Тим сначала предложил искать свободные промежутки в первом календаре, а затем сравнивать их со вторым графиком . Он планировал вычислять разницу между концом одного занятия и началом следующего. Если полученный интервал соответствовал минимальной длительности встречи, Тим проверял бы доступность второго человека в это же время .
Клеман Михайлеску предложил упростить подход через объединение данных . По его мнению, эффективнее сначала слить оба календаря в один общий список занятого времени. После объединения нужно «схлопнуть» перекрывающиеся интервалы в единые блоки недоступности . Свободные окна между такими блоками и станут ответом на задачу.
Алгоритм Тима трансформировался в четыре этапа:
- Объединение двух отсортированных списков встреч в один по аналогии с сортировкой слиянием .
- Слияние перекрывающихся интервалов (например, если один занят с 10:00 до 11:30, а другой — с 11:00 до 12:00) .
- Вычисление промежутков между итоговыми блоками занятости.
- Фильтрация промежутков, которые короче требуемой длительности встречи.
⌨️ Реализация на Python и технические нюансы 29:40
Тим выбрал Python для написания кода. Он начал с создания вспомогательной функции compareTimes для работы со строковыми форматами . Функция переводит время из формата «HH:MM» в общее количество минут от начала дня . Это позволяет выполнять математические сравнения интервалов как обычных целых чисел.
В процессе реализации возникли следующие сложности:
- Использование метода
pop()при обработке списка может увеличить временную сложность до O(N²) . - Необходимо аккуратно обрабатывать указатели при достижении конца одного из списков во время слияния .
- Тим забыл учесть дневные границы в финальном коде, сосредоточившись на основной логике слияния .
По оценке Тима, временная сложность его решения в среднем составляет O(N + M), где N и M — количество встреч в каждом календаре . Пространственная сложность также линейна, так как алгоритм создаёт новый список для хранения объединённого расписания .
📝 Оценка результатов и обратная связь 53:07
Клеман Михайлеску присвоил Тиму оценку «Strong Hire» (рекомендован к найму), несмотря на мелкие ошибки в коде . Интервьюер отметил, что задача относится к категории очень сложных (Very Hard) на AlgoExpert. Сложность заключается не в самом алгоритме, а в большом количестве входных данных разного типа и необходимости их форматирования .
Клеман Михайлеску выделил сильные стороны кандидата:
- Активное общение и уточняющие вопросы в начале процесса .
- Использование вспомогательных функций (
helper functions) для упрощения основной логики . - Способность самостоятельно найти и исправить логическую ошибку в процессе обсуждения .
Тим признал, что коммуникация во время кодинга мешала ему сосредоточиться на деталях . Клеман Михайлеску подчеркнул: в реальном интервью от кандидата не ждут идеально чистого кода за 45 минут, если задача имеет высокий уровень сложности. Главным фактором успеха стала демонстрация правильного хода мыслей и умение структурировать решение .