Разбить отсортированный поток событий на сессии по 30-минутному разрыву
timestamps — времена событий одного пользователя в Unix-секундах, по возрастанию. Разрыв более 30 минут (1800 секунд) между соседними событиями начинает новую сессию. Верните список длин сессий, где длина сессии — её последняя метка минус первая (в секундах).
Одиночное событие — сессия длины 0. Пустой вход возвращает [].
def session_lengths(timestamps: list[int], gap: int = 1800) -> list[int]:
# ваш код здесь
Напишите реализацию.
Пройдите по меткам один раз, храня начало сессии и предыдущее событие. Когда шаг до следующего события превышает разрыв, закройте сессию — последняя минус первая — и начните новую. После цикла сбросьте последнюю; это один проход O(n).
- ✗Мерить разрыв от начала сессии, а не от предыдущего события
- ✗Бить на фиксированные окна часов вместо разрывов между событиями
- ✗Забывать сбросить последнюю сессию после цикла
- →Как вернуть число событий на сессию вместо длительностей?
- →Что меняется, если сортировка входа не гарантирована?
Track the current session's start and the prev timestamp. A gap larger than gap closes the session; append prev - start. Flush the last session after the loop.
def session_lengths(timestamps, gap=1800):
if not timestamps:
return []
lengths = []
start = prev = timestamps[0]
for t in timestamps[1:]:
if t - prev > gap:
lengths.append(prev - start)
start = t
prev = t
lengths.append(prev - start)
return lengths
For times [0, 600, 1200, 5000, 5600] the 5000 - 1200 = 3800-second jump splits into two sessions: [0, 600, 1200] of length 1200 and [5000, 5600] of length 600, so the result is [1200, 600].