计算数字k在0到n中的出现的次数,k可能是0~9的一个值
例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现1出现了5次 (1, 10, 11, 12)
思路:参考《编程之美》中提供的求数字1的个数的解法,本题只是做了一个推广,k可以为0~9中任意值。解法一样,只是要考虑k为0的两种特殊情况:一种是k=0,n=0时,直接返回1;另一种是k=0时,最高位的0不予计算,因为没有以0开头的数
1 class Solution { 2 public: 3 /* 4 * @param : An integer 5 * @param : An integer 6 * @return: An integer denote the count of digit k in 1..n 7 */ 8 int digitCounts(int k, int n) { 9 if(k<0 || n<0)return -1; 10 if(k==0 && n==0)return 1;//特殊情况 11 int factor=1; 12 int low=0; 13 int cur=0; 14 int high=0; 15 int sum=0; 16 while(n/factor) 17 { 18 low=n%factor; 19 cur=(n/factor)%10; 20 high=n/(10*factor); 21 if(cur<k) 22 { 23 sum+=high*factor; 24 }else if(cur==k){ 25 sum+=high*factor+low+1; 26 }else if(k!=0 || (k==0 && high!=0)){//避免计算最高位为0的个数的情况 27 sum+=(high+1)*factor; 28 } 29 factor*=10; 30 } 31 return sum; 32 } 33 };