链接
https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/
题意
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
解法
某位中 11 出现次数的计算方法:
根据当前位 curcur 值的不同,分为以下三种情况:
当 cur = 0 时: 此位 1 的出现次数只由高位 high 决定,计算公式为:$high \times digit$
比如对于数字2304,可以取的是$23 \times 10 = 230$(0010-2219 1固定不动)
当 cur = 1 时: 此位 1 的出现次数由高位 high 和低位 low 决定,计算公式为:$high \times digit + low + 1$
比如对于数字2314,可以取的是$23 \times 10 + 4 + 1 = 235$(0010-2314 1固定不动)
当 cur = others 时: 此位 1 的出现次数只由高位 high 决定,计算公式为:$(high + 1) \times digit$
比如对于数字2334,可以取的是$(23 + 1) \times 10 = 240$(0010-2319 1固定不动)
还有一个通用解法使用数位dp
这里也给出一份代码供参考
代码
数学解法
1 | class Solution { |
数位dp
1 | class Solution { |