У меня есть набор Python, содержащий числа, представляющие часы на 24-часовых часах, например

s = set([1, 3, 8, 23])
s
>>> {1, 3, 8, 23}

Я хочу найти размер наименьшего диапазона часов, который охватывает каждый час в наборе. Обычно я мог бы использовать

max(s) - min(s)
22 

Но в этом случае наименьший диапазон может быть обернут вокруг модуля (полуночи), поэтому ответ будет неправильным. Правильный ответ: все значения находятся между 23 и 8, поэтому наименьший диапазон составляет 9 часов.

Есть ли эффективный способ рассчитать это с помощью Python?

3
James 17 Дек 2015 в 18:09

3 ответа

Лучший ответ
  • отсортировать набор и добавить первый час другого дня (l[0] + 24)
  • Найди отличия
  • результат 24 - максимальная разница

>>> l = sorted(s)
>>> l.append(l[0] + 24)
>>> 24 - max(b-a for a,b in zip(l, l[1:]))
9
1
pacholik 17 Дек 2015 в 15:34

Вот решение. Во-первых, возьмите список из вашего набора часов:

s = set([1, 3, 8, 23])
sortedhours = sorted(s)

Тогда получите всю упаковку этих часов около полуночи:

twodays = sortedhours + [h+24 for h in sortedhours]
allwraps = [twodays[i-len(s):i] for i in range(len(s), len(twodays))]

Затем сделайте то, что вы просили, то есть вычислите минимальный диапазон для всей упаковки около полуночи:

min(map(lambda l: max(l)-min(l), allwraps))
# 9
0
DainDwarf 17 Дек 2015 в 15:40

Я думаю, что вы должны рассматривать каждый элемент как отправную точку, и рассмотреть, что диапазон с этим:

l = sorted(s)
ans = l[-1] - l[0]
for i in range(len(l)):     # I know that's horrible normally
    wrapped = l[i-1] - l[i] + 24
    if wrapped < ans:
       ans = wrapped
-1
Martin Bonner supports Monica 17 Дек 2015 в 19:00