查找集合的范围,其中集合中的值环绕模数
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
我有一个 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