题目:
给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
思路:
从个位开始,计算每个数位上1出现的个数,最后进行累加。
参考官方解答:https://leetcode-cn.com/problems/number-of-digit-one/solution/shu-zi-1-de-ge-shu-by-leetcode-solution-zopq/
解答:
class Solution:
def countDigitOne(self, n: int) -> int:
# mulk 表示 10^k
# 在下面的代码中,可以发现 k 并没有被直接使用到(都是使用 10^k)
# 但为了让代码看起来更加直观,这里保留了 k
k, mulk = 0, 1
ans = 0
while n >= mulk:
ans += (n // (mulk * 10)) * mulk + min(max(n % (mulk * 10) - mulk + 1, 0), mulk)
k += 1
mulk *= 10
return ans