【003】计算0至一个数字n之间指定数字k(1~9)的出现次数(含重复)

问题描述:计算0至一个数字n之间指定数字k(1~9)的出现次数(含重复)。
重点:

  1. 求数字n由高位至低位每位重(个十百……)数字k值的出现次数

主要考点:

  1. 如何通过非暴力手段(fori逐数字匹配的方式)获取最终答案

算法公式:

public static  int digitCounts(int k, int n) {
        int i = 1;
        int count =0;
        int current=0;
        int high=0;
        int low=0;

        while(n / i != 0){
            current = n / i % 10;   //当前位
            high = n / (i*10);        //最高位
            low = n - n / i * i;       //最低位
            //当前位数字小于指定值时,指定值出现次数为最高位乘数位补差值(如十位补乘10,百位补乘100)
            if(current < k)
                count += high * i;
            //当前位数字等于指定值时,指定值出现次数为最高位乘数位补差值加上后最低位再加1(k值叠加)
            if(k == current)
                count += high * i + low + 1;
            //当前位数字大于指定值时,指定值出现次数为最高位+1乘数位补差值(k值叠加)
            if(current > k)
                count += (high + 1) * i;
            //数位补差值更新,每向前推进一位,则补差值乘10(可以理解为最高位后补0)
            i *= 10;
        }

        if(k == 0 && n >= 10){
            count -= i / 10;
        }

        return count;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容