题目
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例一:
输入:n = 12 输出:5
示例二:
输入:n = 13 输出:6
限制:
- 1 <= n < 2^31
分析
该题主要就是找数学式子,如下两图已经展示出三个式子以及例子,cur指针从后向前遍历,从个位逐步指到最高位,过程中,high就是cur前面的数字,low就是cur后面的数字,如果cur不是1就得假设它是1,然后也根据high,low,bit计算出来存在个数,最后汇总每一位是1时的所有可能的总数和。
代码
class Solution {
public int countDigitOne(int n) {
long bit = 1;
long sum = 0;
while(bit <= n){
long cur = (n/bit)%10;
long low = n%bit;
long high = n/bit/10;
if(cur >1){
sum +=(high+1)*bit;
}else if(cur == 1){
sum+=high*bit+low+1;
}else{
sum+=high*bit;
}
bit = bit*10;
}
return (int)sum;
}
}