📅  最后修改于: 2023-12-03 15:12:01.469000             🧑  作者: Mango
给定一个正整数N,求从1到N的所有数字中1出现的总位数。
对于N = 12,数字1出现的总位数是5。
我们可以从数字的每一位入手,统计每一位出现1的次数,然后将所有的次数加起来即可。假设N的位数是n,则对于第i位(从右往左数),它的出现次数为:
根据上面的分析,我们可以通过循环遍历每一位,计算当前位1出现的次数,并将所有次数加起来。具体实现可以参考下面的代码。
def countDigitOne(n: int) -> int:
if n <= 0:
return 0
res = 0
m = 1
while m <= n:
a = n // m
b = n % m
# 计算当前位1出现的次数
if a % 10 == 0:
res += a // 10 * m
elif a % 10 == 1:
res += a // 10 * m + b + 1
else:
res += (a // 10 + 1) * m
m *= 10
return res
由于我们只需要循环n的位数次,所以时间复杂度是O(logn)。
只需要常数个变量,所以空间复杂度是O(1)。