思想:

 递归实现

 首先,若这个数的最高位是1,则他的最高位含1的数量为:这个数出去最高位剩下的数+1

    若这个数的最高位不是1,则它的最高位的含1的数量为:10的k-1次方,k是n的位数

 然后,其余为可以用最高位的数字*除去最高位剩下的位数*某一位固定是1的情况(10的k-2次方)

    最后,递归实现。

 最优解代码:

 

import java.util.*;
import java.lang.Math;
 
public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        if(n < 1 ){
            return 0;
        }
        int len = GetLen(n);
        if(len == 1){
            return 1;
        }
        int tmp = GetPowernum(len-1);
        int first = n/tmp;
        int firstnum = first == 1? n%tmp+1 : tmp;
        int othernum = first*(len-1)*(tmp/10);
        return firstnum+othernum+NumberOf1Between1AndN_Solution(n%tmp);
    }
    public int GetLen(int n){
        int len = 0;
        while(n != 0){
            len++;
            n = n/10;
        }
        return len;
    }
    public int GetPowernum(int dase){
        return (int) Math.pow(10,dase);
    }
}

 

 

 时间复杂度:O(logN*logN),其中递归的时间复杂度是logN,GetLen和GetPowernum的时间复杂度分别为O(logN)和O(log(logN))