问题描述:计算0至一个数字n之间指定数字k(1~9)的出现次数(含重复)。
重点:
- 求数字n由高位至低位每位重(个十百……)数字k值的出现次数
主要考点:
- 如何通过非暴力手段(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;
}