题目:1~n整数中1出现的次数
思路:
以cur
所指向的位数的数字为界,将数字分为三个部分:
左边高位组成的数为high
,右边低位组成的数为low
,cur
指向数组的位数为digit
;
cur
从低位依次遍历到高位,累加cur
在每一个位置上包含1
的个数;
当cur
所指的数字为0
时,1
出现的次数为: high * digit
;
当cur
所指的数字为1
时,1
出现的次数为: high * digit + low + 1
;
当cur
所指的数字为其他数字时,1
出现的次数为: (high+1) * digit
;
代码:
class Solution {
public int countDigitOne(int n) {
// 初始化
int low = 0, high = n/10, cur = n%10;
int digit = 1;
int res = 0;
// 遍历
while(high != 0 || cur != 0){
if(cur == 0){
res += high*digit;
}else if(cur == 1){
res += (high * digit) + low + 1;
}else{
res += (high + 1) * digit;
}
//更新cur位置
low = cur*digit + low;
cur = high % 10;
high = high / 10;
digit *= 10;
}
return res;
}
}