思想:
递归实现
首先,若这个数的最高位是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))