查找集合的范围,其中集合中的值环绕模数

Find range of a set where values in the set wrap around a modulus

我有一个 Python 集合,其中包含代表 24 小时制小时数的数字,例如

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

我想找到涵盖集合中每个小时的最小小时范围的大小。通常我可以使用

max(s) - min(s)
22 

但在这种情况下,允许最小范围环绕模数(午夜),所以答案是错误的。正确答案是所有值都在 23 到 8 之间,因此最小范围是 9 小时。

是否有使用 Python 进行计算的有效方法?

我认为您必须将每个元素都视为一个起点,并考虑其范围:

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
  • 对集合进行排序并追加另一天的第一个小时 (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

这是一个解决方案。 首先,列出您的一组时间:

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