JAVA-JZ31计算1到n中1出现的次数
整数中1出现的次数(从1到n整数中1出现的次数)
http://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6
算法最后呈现得结果就是把n分成两部分来计算以145和245来做例子理解,讲145分成1到45,46到145来计算。
核心过程就是
1.计算最高位为1的
1.1如果首位为1,最高位为1有余数+1种可能,100,101...145
1.2如果首位不为1,最高位为1有分位数(不知道如何描述10的(len-1)次幂)种可能,就100,
2.计算其它位位1
145除去首位百位还有个位十位(46到145),这两个坑随便选一个给1占着,还剩len-1-1个坑位,有0到9十种可能.十位为1 ,110,111,..119(0到9),个位为1,有51,61,71,81,91,101,111,121,131,141(0到9)
1,2,想加加上NumberOf1Between1AndN_Solution(45)public class Solution { public int NumberOf1Between1AndN_Solution(int n) {
if(n == 0){ return 0; } String str = ""+n; int len = str.length(); if (len == 1){ return 1; } int res = (int)Math.pow(10,len-1); int firstNumber = n/res; int mod =n%res; int firstBit = firstNumber == 1 ? mod+1:res; int otherBit =(len-1)*firstNumber*res/10;//1的位置(len-1);每个位置都有(len-2)个位数的可能,重复了高位数可能 return firstBit+otherBit+NumberOf1Between1AndN_Solution(mod);//分成1-->mod 和mod+1-->n两部分来计算 }
}
```