leetcode 233. 数字1的个数

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

示例:


输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。

思路:

  • 假设n=abcde,如果要计算百位上的1的次数,受到3个因素的影响:百位上的数字,百位下的数字,百位上的数字。
  • 如果百位上的数字是0,百位上可能出现的1的次数由更高位决定,等于(ab)*100
  • 如果百位上数字是1,百位上可能出现的1的次数由更高位和低位决定,等于(ab)*100+(cde)+1
  • 如果百位上数字是其他,百位上可能出现的1的次数由更高位决定,等于(ab+1)*100.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def countDigitOne(self, n):
"""
:type n: int
:rtype: int
"""
if n <= 0:return 0
factor = 1
count = 0
while n//factor != 0:
lower = n - n//factor*factor
cur = n//factor%10
higher = n//(factor*10)
if cur == 0:
count += higher*factor
elif cur == 1:
count += higher*factor + lower + 1
else:
count += (higher+1)*factor
factor *= 10
return count