主要思路
- 数字n转换为string,便于单独处理每一位,s[i]代表当前处理的数字
- 公式:x位数以内 1的个数,为
- 从个位数
s[0]开始处理,将每一位对应的结果存入dp[i]。 - 以n = 2134为例
- 假如当前s[i] = 3,则
dp[3] = 0~34所含的1数目 = OnesIn(0~34)
s[i] == 1时,例子中的i = 1,要处理0~134, 其中ones in (百位)=ones in (100)+ones in (101~134)s[i] != 1时,假设i=0,s[i] = 2,
- 假如当前s[i] = 3,则
代码实现
公式 中的x = len(s)-i-1
class Solution:
def countDigitOne(self, n: int) -> int:
s = []
s = str(n)
l = len(s)
dp = [0 for _ in range(l+1)]
for i in range(l-1, -1, -1):
x = l-i-1
if s[i] == '1':
dp[i] = x*pow(10, x-1) + dp[i+1] + n%int(pow(10, x)) + 1
else:
dp[i] = (int(s[i])-int('0'))*(x)*pow(10, x-1) + min(1, int(s[i])-int('0'))*pow(10,x) + dp[i+1]
return int(dp[0])