我们得到一个大数'num',最多可以有10 ^ 4位数(num <= 10 ^(10000)),我们需要从1开始查找十进制表示中的零个数upto'num'。
eg:
countZeros('9') = 0
countZeros('100') = 11
countZeros('219') = 41
我能想到的唯一方法就是做蛮力,这对于大输入来说显然太慢了。
我在this链接中找到了以下python代码,它在O(L)中需要,L是'num'的长度。
def CountZeros(num):
Z = 0
N = 0
F = 0
for j in xrange(len(num)):
F = 10*F + N - Z*(9-int(num[j]))
if num[j] == '0':
Z += 1
N = 10*N + int(num[j])
return F
我无法理解它背后的逻辑......任何一种帮助都会受到赞赏。
答案 0 :(得分:1)
from 0 - 9 : 0 zeros
from 10 - 99: 9 zeros ( 10, 20, ... 90)
--100-199 explained-----------------------
100, 101, ..., 109 : 11 zeros (two in 100)
110, 120, ..., 199: 9 zeros (this is just the same as 10-99) This is important
Total: 20
------------------------------------------
100 - 999: 20 * 9 = 180
total up to 999 is: 180 + 9: 189
CountZeros('999') -> 189
继续这种模式,你可能会开始看到整体模式,最终看到算法。
答案 1 :(得分:0)
以下内容是否有助于您理解:
>>> for i in range(10, 100, 10):
... print(CountZeros(str(i)))
...
1
2
3
4
5
6
7
8
9
>>>
这个怎么样:
>>> CountZeros("30")
j Z N F
0 0 0 0
j Z N F
0 0 3 0
j Z N F
1 0 3 0
j Z N F
1 1 30 3
3