私は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