LintCode-Digit Counts

LiBlog發表於2014-12-31

Count the number of k's between 0 and n. k can be 0 - 9.

Example

if n=12, in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], we have FIVE 1's (1, 10, 11, 12)

Analysis:

Method 1: directly count every number.

Method 2: Analytical solution.

Every time, calculate how many k has appears on a specific postion, i.e., on 1, 10, 100,.....

Solution 1:

 1 class Solution {
 2     /*
 3      * param k : As description.
 4      * param n : As description.
 5      * return: An integer denote the count of digit k in 1..n
 6      */
 7     public int digitCounts(int k, int n) {
 8         int[] record = new int[10];
 9         Arrays.fill(record,0);
10         for (int i=0;i<=n;i++){
11             String temp = Integer.toString(i);
12             for (int j=0;j<temp.length();j++){
13                 int ind = (int) (temp.charAt(j)-'0');
14                 record[ind]++;
15             }
16         }
17         return record[k];
18                 
19     }
20 };

Solution 2:

 1 class Solution {
 2     /*
 3      * param k : As description.
 4      * param n : As description.
 5      * return: An integer denote the count of digit k in 1..n
 6      */
 7     public int digitCounts(int k, int n) {
 8         int res = 0;
 9         int base = 1;
10         while (base<=n){
11             int part1 = n/(base*10);
12             if (base>1 && k==0 && part1>0) part1--;
13             part1 *= base;
14             int bar = n/base%10;
15             int part2 = 0;
16             if (k<bar) part2 = base;
17             else if (k==bar) part2 = n%base+1;
18             if (k==0 && n<base*10) part2 = 0;
19             res += part1+part2;
20             base*=10;
21         }
22         return res;    
23     }
24 };