📅  最后修改于: 2023-12-03 15:12:39.057000             🧑  作者: Mango
给定一个正整数 $n$,请写出一个函数来计算小于等于 $n$ 的非负整数中数字 1 出现的次数。
例如,给定 $n = 13$,则返回 $6$,因为数字 $1$ 出现在以下数字中:$1, 10, 11, 12, 13$。
这道题我们可以从逐位分析的角度入手。对于一个数 $m$,我们可以分别分析它的个位、十位、百位......等等上出现数字 $1$ 的个数。为了简化分析,我们设当前分析的位数为 $i$。
那么,在 $1\sim m$ 之间,出现 $1$ 的次数就是两种情况下 $1$ 出现的总次数。
那么,在 $1\sim m$ 之间,出现 $1$ 的次数就是两种情况下 $1$ 出现的总次数。
class Solution:
def countDigitOne(self, n: int) -> int:
# 特判
if n <= 0:
return 0
# 初始化
x, res = 1, 0
while n >= x:
# 取当前位
y = n // x % 10
# 统计出现 1 的次数
res += (n // (10 * x)) * x + min(max(n % (10 * x) - x + 1, 0), x) if y == 1 else (n // (10 * x) + 1) * x if y > 1 else 0
# 更新位数
x *= 10
return res
时间复杂度:$O(\log n)$
空间复杂度:$O(1)$