参考了https://blog.csdn.net/z_opt/article/details/75570728 这篇文章,但是这篇文章对k=0时候的算法是错误的。
以下是当k==0,对十位进行分析:
例1:n=723,k=0 即(((n/10)%10)>k)
十位:十位出现0的情况为100~109 ......... 600~609 ,700~709
出现的个数为:70次 即(n/10/10)x10
例2:n=703,k=0 即(((n/10)%10)==k)
十位:十位出现0的情况为100~109 ......... 200~209 ,700~703
出现的次数是7 x10+4=74 即(n/10/10)x10+n%10+1
当k>0时候,对十位进行分析:
例1:n=723,k=1 即(((n/10)%10)>k)
十位:十位出现1的情况为010~019 ,110~019 .........610~619 ,710~719
出现的个数为:80次 即(n/10/10+1)x10
例2:n=723,k=2 即(((n/10)%10)==k)
十位:十位出现2的情况为020~029 ,120~129 .........620~629 ,720~723
出现的次数是7x10+4=74 即(n/10/10)x10+n%10+1
例3:n=723,k=3 即(((n/10)%10)
出现的次数是7x10=70次 即(n/10/10)x10
以下为修正后的代码:
*/
public int digitCounts(int k, int n) {
// write your code here
int count=0,singlecount=0;
int p=n;
int num=0;//表示处理数字的位数 num=0表示处理个位 1表示十位等
if(n==0&&k==0) return 1;
if(k>0){
while(p!=0){
if((p%10)>k) singlecount=(int) ((p/10+1)*(Math.pow(10, (double)num)));
if((p%10)==k) singlecount=(int) ((p/10)*(Math.pow(10, (double)num))+(n%((Math.pow(10, (double)num))))+1);
if((p%10)k)
singlecount=(int) ((p/10+1)*(Math.pow(10, (double)num)));
if(p%10==k)
singlecount=(int) ((p/10)*(Math.pow(10, (double)num))+(n%((Math.pow(10, (double)num))))+1);
}else{
if(p%10>k)
singlecount=(int) ((p/10)*(Math.pow(10, (double)num)));
if(p%10==k)
singlecount=(int) ((p/10-1)*(Math.pow(10, (double)num))+(n%((Math.pow(10, (double)num))))+1);
}
count+=singlecount;
p=p/10;
num++;
}
}
return count;
}