我有15个号码,
[1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]
我有人输入数量,我想要的是四舍五入到最低数字。因此,如果有人进入36
,它将四舍五入30
。
bisect
将在 O(log N) 中完成:
>>> import bisect
>>> L = [1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]
>>> L[bisect.bisect(L, 36) - 1]
30
或使用纯 python 和 O(N):
>>> L = [1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]
>>> next(elem for elem in reversed(L) if elem <= 36)
30
假设L
列表已排序。否则L.sort()
之前。
使用纯python:
>>> numbers = [1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]
>>> x = 36
>>> max(n for n in numbers if n <= x)
30
注意:不依赖于排序的数字列表。
这是一个递归解决方案。它应该是 O(log n); 它依赖于列表已排序的事实。
L = [1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]
def roundit(x,n):
if len(x) == 1:
return x[0]
elif x[len(x)/2] > n:
return roundit(x[0:len(x)/2],n)
else:
return roundit(x[len(x)/2 :],n)
结果:
>>> roundit(L,36)
30
>>> roundit(L,77)
70
>>> roundit(L,150)
150