![bb72687d35c554a7080abb39ce40c9fd.png](https://i-blog.csdnimg.cn/blog_migrate/eb70bea2c4d89d4ff0acde025860b5bb.jpeg)
题目
题目描述
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例1
输入: n = 12 输出: 5
示例2
输入: n = 13 输出: 6
题解
(引用Krahets)
位数规律
依次遍历数字n的每一位数,根据规律统计出现1的个数。
- 当前位 = 0: 只由高位决定,即
high * digit
; - 当前位 = 1: 由高位和低位共同决定,即
high * digit + low + 1
; - 否则: 只由高位决定,即
(high + 1) * digit
;
时间复杂度: O(logn),遍历数字n的位数,需要循环logn次; 空间复杂度: O(1),变量占用常数级额外空间;
class Solution:
def countDigitOne(self, n: int) -> int:
low, cur, high = 0, n % 10, n // 10
digit, res = 1, 0
while high != 0 or cur != 0:
if cur == 0:
res += high * digit
elif cur == 1:
res += high * digit + low + 1
else:
res += (high + 1) * digit
low += cur * digit
cur = high % 10
high //= 10
digit *= 10
return res