剑指 Offer 43. 1~n 整数中 1 出现的次数
题目:
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
输入:n = 12
输出:5
示例 2:
输入:n = 13
输出:6
限制:
1 <= n < 2^31
注意:本题与主站 233 题相同:https://leetcode-cn.com/problems/number-of-digit-one/
解题思路:
代码:
class Solution:
def countDigitOne(self, n: int) -> int:
# "1"出现的次数 = sum ("1"在各个计数位上出现的次数)
# 从个位开始向最高位统计
# 3101592
# 将数字拆分为[a...][cur][b...]
# cur 为当前位
base = 1
res = 0
while base <= n:
# 计算 a..., cur, b...
a = n // base // 10
cur = (n // base) % 10
b = n % base
# 将当前位设为1,考察其他部分的变化范围
# 一、cur > 1,
# [3101 ] 5 [92]
# 变化范围:[0-3101] 1 [0-99]
# 总个数: (a+1) * base
if cur > 1:
res += (a + 1) * base
# 二、cur == 1,
# [310] 1 [592]
# 1、变化范围 [0-309] 1 [0-999]
# a * base
# 2、变化范围 [310] 1 [0-592]
# 1 * (b+1)
# 总个数:a *base + (b + 1)
elif cur == 1:
res += a * base + b + 1
# 三、cur < 1,
# [31] 0 [1592]
# 变化范围 [0-30] 1 [0-9999]
# 总个数 a * base
else:
res += a * base
base *= 10
return res