【发布时间】:2020-06-01 02:34:55
【问题描述】:
我想计算在特定范围内使用了多少次“0”到“9”
例如112有两个'1'和一个'2'
感谢您的建议,我现在更改了代码。
但它没有我想要的效率。
num = int(input('n : '))
start_time = time.time()
num_arr = [0] * 10
progress_arr = ['%d' % (num * (i / 100)) for i in range(1, 101)]
for i in range(1, num + 1):
if str(i) in progress_arr:
print(str(progress_arr.index(str(i)) + 1) + '%')
for digit in str(i):
num_arr[int(digit)] += 1
print('Time : %.2f' % (time.time() - start_time))
print(num_arr)
当我输入 1000 作为 n 时,我的程序会立即打印这个 arr
[192, 301, 300, 300, 300, 300, 300, 300, 300, 300]
表示从 1 到 1000, '0' 被使用了 192 次,'1' 被使用了 301 次和···
但是当我输入 2,000,000,000 作为 n 时,我的程序将在之后打印结果 11 分钟(使用 pypy3,Ryzen 2600)。
所以我想更改我的代码,以尽可能立即获得非常大的数字的结果。
在我之前的问题中,我提到了 O(N) 的时间复杂度,因为我对算法和时间复杂度的理解很差,这让你感到困惑。所以我删了。
我想知道的只是高效算法。
我正在尝试通过分析增量结果的差异来找到一个特定的规则,但这并不容易。
【问题讨论】:
-
你需要像数字动态规划这样的东西。看看这个教程:geeksforgeeks.org/digit-dp-introduction
-
你的程序远比 O(n^2) 差。考虑一下您 a) 构建每个不同数字的流表示,然后 b) 迭代整个字符串的次数。
-
你的代码已经是O(N)了,问题是N很大
-
我现在更改了我的代码。
-
get the result of 'n : 2 billion' instantly. N : the length of the input number (number of digits)-- 你真的想立即获得 20 亿位数的结果吗?
标签: python python-3.x algorithm numbers