# Клеман Михайлеску: «Тим получил бы Strong Hire за решение задачи уровня Very Hard»

Источник: https://www.youtube.com/watch?v=3Q_oYDQ2whs
Канал: Clément Mihailescu
Опубликовано: 26.12.2019

---

Клеман Михайлеску провёл тестовое техническое интервью с 19-летним канадским студентом Тимом, известным по YouTube-каналу Tech with Tim. Тим готовился к собеседованиям в крупные ИТ-компании в течение трёх недель и решил около 50 задач на платформе AlgoExpert.

## 📅 Задача: поиск свободного времени в календарях
[[JUMP:03:09]]

Интервьюер предложил написать алгоритм для поиска общих свободных слотов в графиках двух сотрудников [03:21]. Входящие данные представлены в виде списков занятых интервалов, например, с 12:00 до 13:00 и с 15:00 до 16:30 [04:00]. Дополнительно учитываются «дневные границы» — время начала и окончания рабочего дня, раньше или позже которых встречи проводить нельзя [04:42]. 

Условия задачи включают следующие параметры:

*   Время передаётся в виде строк в 24-часовом (военном) формате.
*   Календари изначально отсортированы по времени начала встреч [06:28].
*   Длительность искомого окна может быть любой (например, 30 минут или 1 час).
*   Если одна встреча заканчивается в 11:30, а следующая начинается в 11:30, это считается допустимым переходом [07:39].

## 💡 Выработка стратегии решения
[[JUMP:07:53]]

Тим сначала предложил искать свободные промежутки в первом календаре, а затем сравнивать их со вторым графиком [09:22]. Он планировал вычислять разницу между концом одного занятия и началом следующего. Если полученный интервал соответствовал минимальной длительности встречи, Тим проверял бы доступность второго человека в это же время [10:42].

Клеман Михайлеску предложил упростить подход через объединение данных [20:10]. По его мнению, эффективнее сначала слить оба календаря в один общий список занятого времени. После объединения нужно «схлопнуть» перекрывающиеся интервалы в единые блоки недоступности [21:04]. Свободные окна между такими блоками и станут ответом на задачу.

Алгоритм Тима трансформировался в четыре этапа:

1.  Объединение двух отсортированных списков встреч в один по аналогии с сортировкой слиянием [21:32].
2.  Слияние перекрывающихся интервалов (например, если один занят с 10:00 до 11:30, а другой — с 11:00 до 12:00) [22:56].
3.  Вычисление промежутков между итоговыми блоками занятости.
4.  Фильтрация промежутков, которые короче требуемой длительности встречи.

## ⌨️ Реализация на Python и технические нюансы
[[JUMP:29:40]]

Тим выбрал Python для написания кода. Он начал с создания вспомогательной функции `compareTimes` для работы со строковыми форматами [30:19]. Функция переводит время из формата «HH:MM» в общее количество минут от начала дня [31:25]. Это позволяет выполнять математические сравнения интервалов как обычных целых чисел.

В процессе реализации возникли следующие сложности:

*   Использование метода `pop()` при обработке списка может увеличить временную сложность до O(N²) [48:35].
*   Необходимо аккуратно обрабатывать указатели при достижении конца одного из списков во время слияния [50:45].
*   Тим забыл учесть дневные границы в финальном коде, сосредоточившись на основной логике слияния [55:03].

По оценке Тима, временная сложность его решения в среднем составляет O(N + M), где N и M — количество встреч в каждом календаре [48:50]. Пространственная сложность также линейна, так как алгоритм создаёт новый список для хранения объединённого расписания [49:12].

## 📝 Оценка результатов и обратная связь
[[JUMP:53:07]]

Клеман Михайлеску присвоил Тиму оценку «Strong Hire» (рекомендован к найму), несмотря на мелкие ошибки в коде [54:24]. Интервьюер отметил, что задача относится к категории очень сложных (Very Hard) на AlgoExpert. Сложность заключается не в самом алгоритме, а в большом количестве входных данных разного типа и необходимости их форматирования [54:50].

Клеман Михайлеску выделил сильные стороны кандидата:

*   Активное общение и уточняющие вопросы в начале процесса [57:09].
*   Использование вспомогательных функций (`helper functions`) для упрощения основной логики [56:05].
*   Способность самостоятельно найти и исправить логическую ошибку в процессе обсуждения [56:31].

Тим признал, что коммуникация во время кодинга мешала ему сосредоточиться на деталях [59:06]. Клеман Михайлеску подчеркнул: в реальном интервью от кандидата не ждут идеально чистого кода за 45 минут, если задача имеет высокий уровень сложности. Главным фактором успеха стала демонстрация правильного хода мыслей и умение структурировать решение [57:36].