题目链接: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次。
题解:
cur=0,count = high*i;
cur=1,count=high*i+low+1;
cur>1,count=high*i+i
需要对数字进行观察找规律。
可以将数字分为三部分,统计当前位1出现的次数,当前位数字cur,高位high,低位low,位数为i。
例如对数字4210,如果当前位是十位,那么cur为1,高位high为42,低位low为0,位数i=10。
1、当cur=0时,高位high部分从0~(high-1)改变,每一次改变当前位1出现的次数为i,例如高位是42,i=10,当改变12时,1210~1219,一共10次。
即high*i;
2、当cur=1时,除了1的情况,还包括当高位是high时,当前位是1,那么low可以从0~low进行low+1改变。
即high*i+low+1;
3、当cur>1时,除了1的情况,还包括当高位是high,当前位是1时,low中的每一位都可以从0~9中选择,根据排列组合,一共i次
即high*i+i;
int countDigitOne(int n) {
int count=0;
int high=0;
int low=0;
int cur=0;
long long i=1;
while(n/i){
high=n/(i*10);
low=n-(n/i)*i;
cur=(n/i)%10;
if(cur==0) count+=high*i;
else if(cur==1) count+=high*i+low+1;
else count+=high*i+i;
i*=10;
}
return count;
}