拿到这个题目,第一想法就是挨个遍历这n个数,然后依次统计,这样效果很低,考虑的情况也很多。而且,这种做法,根本不会引起面试官对我们的青睐!所以,无疑,需要改进!!!
有一个比较好的解决办法是:直接看代码,比较好解释!
public int NumberOf1Between1AndN_Solution(int n) {
if(n<=0)
return 0;
return NumberOf1(n);
}
public int NumberOf1(int n){
String str=n+"";
int len=str.length();
int count=0;
int t=Integer.valueOf(str.substring(0, 1));
if(n<=0)
return 0;
if(len==1 && n>0)
return 1;
if(t>1){
count=(int)Math.pow(10, len-1);
}
else if(t==1){
count=Integer.valueOf(str.substring(1, len))+1;
}
count+=t*(len-1)*((int)Math.pow(10, len-2))+NumberOf1(Integer.valueOf(str.substring(1,len)));
return count;
}