主要利用递归来做,分析数字每位上为1或者不为1的情况,然后接着分析下一位,从高位往低位分析,代码如下
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
if(n<=0)
return 0;
String s=Integer.toString(n);
int r=NumberOf1(s);
return r;
}
public int NumberOf1(String c){
if(c==null||c.length()==0)
return 0;
int first=c.charAt(0)-'0';
if(c.length()==1&&first==0)
return 0;
if(c.length()==1&&first>0)
return 1;
int numFirstDigit=0;
if(first>1)
numFirstDigit=PowerBase10(c.length()-1);
else if(first==1)
numFirstDigit=Integer.parseInt(c.substring(1))+1;
int numOfOtherDigits=first*(c.length()-1)*PowerBase10(c.length()-2);
int numRecursive=NumberOf1(c.substring(1));
return numFirstDigit+numOfOtherDigits+numRecursive;
}
public int PowerBase10(int n){
int result=1;
for(int i=0;i<n;i++){
result*=10;
}
return result;
}
}
注意INT和String的相互转化