整数中1出现的次数,可以分解为这个整数中每一位1出现的次数的和
一个整数一位中出现1的次数,首先可以考虑普遍情况,这一位处于这个整数的中间位
这时候又可以分成3种情况(我们以12788这个数进行例子讨论)
1)这个位是0,现在假设12788的7为0.
这时候,在第3位上出现1的可能性就是12000以下的数,它出现第3位为1的次数就是12*pow(10,2)也就是12*100;
也就是00100~11199,这中间,你可以考虑第3为上的1是不变的,其它的四位就是0000~1199
2)这个位是1,现在假设12788的7是1。
这时候,在第3位上出现1的可能性就是12000以下的数,再加上12100~12188,就是12*pow(10,2)+88+1;
也就是00100~12188,第3位上的1是不变的,但是其它位的都是从0000~1288
3)这个位是大于1,
这时候,就可以理解是12100以下以及这个数,就是13*pow(10,2);
也就是00100~12100
最后再考虑边界情况,最高位和最低位
发现同样满足上面的情况
1 package example; 2 3 import java.util.ArrayList; 4 5 public class NumberOf1Between1AndN_Solution { 6 public int NumberOf1Between1AndN_Solution(int n) { 7 int ret = 0; 8 /* 9 * 把n这个形参的各位按照从低位到高位存储起来 10 */ 11 ArrayList<Integer> nArray = new ArrayList<Integer>(); 12 int temp = n; 13 while (temp > 0) { 14 nArray.add(temp % 10); 15 temp /= 10; 16 } 17 //System.out.println(nArray.size()); 18 //该位之前的高位数字,假设12788,现在计算第三位7,则mask为12 19 int mask = 0; 20 //第几位,因为和nArray的索引刚好是反着的 21 int bitIndex = nArray.size() - 1; 22 int bitNumber = 0; 23 for (int i = 0;i < nArray.size(); i++) { 24 bitNumber = nArray.get(bitIndex); 25 if (bitNumber == 0) { 26 ret += mask * Math.pow(10, bitIndex); 27 } else if (bitNumber == 1) { 28 ret += mask * Math.pow(10, bitIndex) + (n - mask * Math.pow(10, bitIndex + 1) - Math.pow(10, bitIndex) + 1); 29 } else { 30 ret += (mask + 1) * Math.pow(10, bitIndex); 31 } 32 mask = mask * 10 + nArray.get(bitIndex); 33 bitIndex--; 34 } 35 return ret; 36 } 37 public static void main(String[] args) { 38 int ret = new NumberOf1Between1AndN_Solution().NumberOf1Between1AndN_Solution(10); 39 System.out.println(ret); 40 } 41 }