0

我有15个号码,

[1, 5, 10, 20, 30, 50, 70, 100, 150, 200, 500, 1000, 2000, 5000, 10000]

我有人输入数量,我想要的是四舍五入到最低数字。因此,如果有人进入36,它将四舍五入30

4

3 回答 3

7

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()之前。

于 2012-05-10T12:35:55.567 回答
7

使用纯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

注意:不依赖于排序的数字列表。

于 2012-05-10T12:41:17.550 回答
2

这是一个递归解决方案。它应该是 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
于 2012-05-10T13:00:53.723 回答