给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例 1:
输入:n = 13
输出:6
示例 2:
输入:n = 0
输出:0
解题思路
正确性证明
例如:对于n=3015,
- 个位为1的数字组成为[000-301]1,所以共有302个数字个位数为1,所以对答案贡献302个1。
- 十位为1的数字组成为[01-30]1[00-99]和[00]1[00-05],所以共有300+6个数字个位数为1,所以对答案贡献306个1。
- 百位为1的数字组成为[0-2]1[00-99],所以共有300个数字个位数为1,所以对答案贡献200个1。
- 千位数字为1很明显只有1000个数字,1[000-999],所以对答案贡献1000个1。
所以最后的总和为1908
代码
class Solution {public int countDigitOne(int n) {int bef=0,res=0,w=1;while (n>0){int cur=n%10;n/=10;if (cur>1){res+=(n+1)*w;}else if (cur==1){res+=n*w+bef+1;}else res+=n*w;bef+=cur*w;w*=10;}return res;}
}