Опишите задачу сворачивания соседних чисел в диапазоны
Что проверяют
Умеете ли вы за формулировкой увидеть обычный проход одним циклом и аккуратно разобрать краевые случаи. В работе с данными такое сворачивание встречается постоянно: компактная запись идентификаторов, слияние дат, описание диапазонов партиций.
Как отвечать
Сначала проговорите контракт, в условии его обычно нет: числа целые, отсортированы или нет, бывают ли дубли, что считать соседними значениями, как записывать одиночное число. Ответы меняют решение, и интервьюер ждёт именно этих вопросов.
Базовый алгоритм линейный: идём по возрастающей последовательности, держим начало текущего диапазона и предыдущее значение. Если очередное число больше предыдущего на единицу, продолжаем диапазон; если равно предыдущему, это дубль и мы его пропускаем; иначе закрываем диапазон и открываем новый. После цикла обязательно закрываем последний.
from itertools import groupby
def to_ranges(nums):
uniq = sorted(set(nums))
for _, group in groupby(enumerate(uniq), lambda p: p[1] - p[0]):
chunk = [p[1] for p in group]
yield chunk[0], chunk[-1]Приём с groupby держится на том, что внутри подряд идущих чисел разность значения и индекса постоянна. Сложность: линейная по уже отсортированному входу и O(n log n), если сортируем сами. Памяти нужно столько, сколько занимает результат, а на потоке диапазоны можно отдавать генератором и не собирать список целиком.
Где спотыкаются
Молча считают вход отсортированным. Если сортировка нужна, она и определяет сложность, и об этом стоит сказать вслух, а не прятать сортировку в первой строке. Работать лучше с копией: nums.sort() меняет список вызывающего кода.
Забывают дубли. Условие вида «следующее равно предыдущему плюс один» на повторяющемся значении рвёт диапазон, и вместо одного отрезка получается несколько. Дубли либо убираются заранее, либо проверка пишется как «больше предыдущего на единицу или равно ему».
Теряют последний диапазон. Он закрывается не в цикле, а после него, и именно этот хвост чаще всего забывают, вместе с пустым входом и входом из одного элемента.