LintCode计算数字k在0到n中的出现的次数,k可能是0~9的一个值

参考了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) 十位:十位出现1的情况为030~039 ,130~139 ........630~639
出现的次数是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;
    }

你可能感兴趣的:(LintCode计算数字k在0到n中的出现的次数,k可能是0~9的一个值)