Загрузка…
Загрузка…
backend / middle / tech_screening
Формат
online
Стадия
tech_screening
Когда
within_quarter
Длительность
—
01
Код
Задача на лайвкодинг: дан массив статистики по дням (для каждого дня — список пользователей с количеством шагов). Найти «чемпионов» — пользователей, которые участвовали во всех днях соревнования и набрали максимальное суммарное количество шагов; вернуть структуру результата со списком их id и количеством шагов (чемпионов может быть несколько).
Кандидат решил через мапы (количество дней и количество шагов на пользователя), валидацию участников и поиск максимума. Решение принято как рабочее, далее обсуждали оптимизацию.
02
Код
Как думаешь, что можно улучшить/оптимизировать в твоём решении первой задачи?
Follow-up к первой задаче.
03
Код
У тебя два цикла по одной и той же мапе — два раза пробегаешь по одним и тем же данным. Можно ли сделать это в одном цикле (схлопнуть последние три цикла в один, проверяя оба условия чемпионства за одну операцию)?
Follow-up: интервьюер подводил к объединению валидации юзеров и поиска максимума шагов в один проход.
Заметки
Транскрипт лайвкодинг-секции по алгоритмам на Go: две задачи (поиск чемпионов по статистике шагов; суммарная неудовлетворённость покупателей) с обсуждением оптимизаций, оценкой сложности по времени и памяти и теоретическими врезками про бинарный поиск и сортировки. Кандидат отказался писать бинарный поиск и не вспомнил сложности сортировок. Контакт изначально шёл через рекрутёра.
Подготовка
Стоит уверенно знать бинарный поиск (включая реализацию и встроенные функции в Go), базовые алгоритмы сортировки и их сложности, оценку решений по big O (время и дополнительная память), а также внутреннее устройство мап в Go (бакеты, эвакуация).
Стиль интервьюера
Интервьюер доброжелательный, не давил: наводящими вопросами подталкивал к оптимизации решения (объединение циклов, сортировка + бинарный поиск), подсказывал (встроенная функция бинарного поиска в Go), принял отказ писать реализацию. Обещал фидбек через рекрутёра в течение пары дней.
04
Теория
Оцени своё решение первой задачи по асимптотической сложности (big O) по времени.
Follow-up к первой задаче; кандидат разложил сложность по количеству дней, юзеров и валидированных юзеров.
05
Теория
Оцени решение первой задачи по дополнительной памяти (входные данные не считаем): какие дополнительные структуры заводишь и сколько памяти они занимают?
Кандидат попутно рассуждал про устройство мап в Go (бакеты, эвакуация, метод цепочек) и преаллокацию мап/слайсов.
06
Код
Задача на лайвкодинг: на рынке размещено множество товаров, каждый представлен числом; у каждого покупателя есть потребность, тоже выраженная числом. Если точного товара нет, покупатель берёт ближайший по значению, что вызывает неудовлетворённость, равную разнице между желаемым и полученным. Количество каждого товара не ограничено. Рассчитать суммарную неудовлетворённость всех покупателей.
Перед написанием кода попросили рассказать верхнеуровнево, как кандидат хочет решать. Кандидат написал решение полным перебором (вложенные циклы) с функцией модуля разности.
07
Код
Как хочешь искать тот товар, который покупатель будет покупать (ближайший по значению)?
Уточняющий вопрос по ходу второй задачи.
08
Код
Решение рабочее, но тяжёлое: как его можно оптимизировать, если покупателей мало, а товаров миллионы (полный перебор будет очень долгим)?
Follow-up ко второй задаче; интервьюер подводил к сортировке массива товаров и бинарному поиску.
09
Теория
А как именно сортировка поможет в данном случае? Если товары идут от 1 до 100 млн, а нужно найти 99-миллионный — всё равно придётся пробежаться почти по всему массиву?
Наводящий follow-up, выводящий на бинарный поиск с логарифмической сложностью; также обсудили случай, когда ближайший товар меньше искомого значения.
10
Теория
Можешь рассказать, как работает бинарный поиск (в теории)?
Кандидат объяснил принцип деления массива пополам и сложность O(log n). Интервьюер упомянул, что в Go есть встроенная функция бинарного поиска.
11
Код
Не хочешь попробовать написать бинарный поиск (реализовать его в коде)?
Кандидат отказался писать реализацию.
12
Теория
Оцени текущее решение второй задачи (полный перебор) по сложности.
Пришли к потенциально квадратичной сложности O(n*m).
13
Теория
Назови три алгоритма сортировки и расскажи, какая у них сложность в среднем (и в худшем) случае.
Кандидат назвал сортировку выбором и быструю сортировку (и ошибочно «рекурсию»), сложности вспомнить не смог.