Создать функцию, которая принимает массив чисел и возвращает строку с диапазонами последовательных чисел
Что проверяют
Умение написать линейный проход с состоянием и не ошибиться на границах. Задача маленькая, поэтому смотрят не на идею, а на аккуратность: уточнили ли вы условие, закрыли ли последний интервал, что вернули на пустом входе.
Как отвечать
Сначала уточнения: отсортирован ли вход, возможны ли дубликаты и отрицательные числа, какой разделитель, что возвращать для пустого массива. Если порядок не гарантирован, сортировка нужна, но это меняет сложность на O(n log n), и про это стоит сказать вслух, а не сделать молча.
def summarize(nums):
if not nums:
return ""
parts, start, prev = [], nums[0], nums[0]
for n in nums[1:]:
if n != prev + 1:
parts.append(str(start) if start == prev else f"{start}->{prev}")
start = n
prev = n
parts.append(str(start) if start == prev else f"{start}->{prev}")
return ", ".join(parts)Для роли, связанной с данными, полезно показать и второй слой. Тот же алгоритм векторизуется: разрывы это места, где np.diff(arr) != 1, и массив режется по ним одним вызовом np.split. В SQL это известный приём gaps and islands: группировать по разности значения и номера строки, у соседних чисел она постоянна.
Где спотыкаются
Теряют последний диапазон. Внутри цикла интервал закрывается только при разрыве, а после выхода из цикла остаётся незакрытый хвост, и его надо дописать отдельно. Это самая частая ошибка именно в этой задаче.
Молча пишут sorted(set(nums)). Дедупликация и сортировка меняют постановку: если вход уже отсортирован, вы добавили лишнюю сложность, а если дубликаты значимы, вы потеряли данные. Такое решение принимается вслух, а не втихую.
Не проверяют вырожденные входы. Пустой массив, один элемент, ровно два соседних числа: последний случай отдельно спрашивают, потому что схлопывать ли пару в диапазон или печатать через запятую, решает условие, а не привычка.