我有一个Python集,其中包含代表24小时制小时的数字,例如
s = set([1, 3, 8, 23])
s
>>> {1, 3, 8, 23}
我想找到覆盖每一小时的最小小时范围的大小。通常我可以使用
max(s) - min(s)
22
但在这种情况下,允许最小范围绕模数(午夜),所以答案是错误的。正确答案是所有值都在23到8之间,所以最小范围是9小时。
有没有一种有效的方法来使用Python计算它?
答案 0 :(得分:1)
l[0] + 24
)>>> l = sorted(s)
>>> l.append(l[0] + 24)
>>> 24 - max(b-a for a,b in zip(l, l[1:]))
9
答案 1 :(得分:0)
这是一个解决方案。 首先,请列出您的小时数:
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
答案 2 :(得分:-1)
我认为你必须将每个元素作为一个起点,并考虑范围是什么:
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