Topic:面经
题目:
Write a method to count the number of 2s between 0 and n. (cc150: 18-4)
Code:
class Test{
public static void main(String[] args){
Solution sol = new Solution();
int n = 100;
System.out.println(sol.countTwo(n));
System.out.println(sol.count(n));
}
}
class Solution{
//Better Algorithm
public int count(int n){
int res = 0, len = String.valueOf(n).length();
for(int i=0; i<len; i++){
res += countDigit(n, i);
}
return res;
}
private int countDigit(int n, int pos){
int pTen = (int)Math.pow(10, pos), pNTen = pTen*10;
int digit = (n/pTen) % 10;
int right = n % pTen;
int roundDown = n - n % pNTen;
int roundUp = roundDown + pTen;
if(digit < 2) return roundDown/10;
else if(digit == 2) return right + 1 + roundDown;
else return roundUp/10;
}
//Brute Force Algorithm
public int countTwo(int n){
int cnt = 0;
for(int i=2; i<=n; i++){
cnt += countImp(i);
}
return cnt;
}
private int countImp(int num){
int cnt = 0;
while(num > 0){
if(num%10 == 2) cnt++;
num /= 10;
}
return cnt;
}
}
总结:
两种方法,第一种明显优于第二种,利用的是每一位上2的出现次数的规律。详细解法参考CC150,18-4。