输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
输入:n = 12
输出:5
示例 2:
输入:n = 13
输出:6
限制:
1 <= n < 2^31
因为是1的出现次数,可以拆解成0~n上,每一位出现了多少此1
所以继续拆解例如109
对于个位:
前面类似于0~407此循环,每次循环0 ~ 9出现1此1,所以一共出现407*1+ 0 ~ 9,即408
对于十位:
前面循环40此,每次是0~100 那么对于十位来说就是出现了10此,
40*10 + 0 = 400
对于百位:1有些特殊,因为本身就是1所以低位的数也要算上例如14 那么就是010 + 4+1
5100 + 09 +1=510
所以得出规律:
假设当前位a,低位b,高位c
a=0 当前位贡献: c*位数(个位就是1,十位10,百位100)
a=1 当前位贡献:c*位数+b+1
a>1 当前位贡献:c*位数+位数
class Solution {
public:
int countDigitOne(int n) {
long sum=0;
int b=0;
for(long i=1;n!=0;i*=10)
{
int a=n%10;
int c=n/10;
if(a==0)
{
sum+=c*i;
}
else if(a==1)
{
sum+=c*i+b+1;
}
else
{
sum+=c*i+i;
}
b=b+a*i;
n/=10;
}
return sum;
}
};