整数中1出现的次数,Java

整数中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 }
原文地址:https://www.cnblogs.com/adamhome/p/8722288.html