• 整数中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 }
  • 相关阅读:
    AJAX入门之深入理解JavaScript中的函数
    檔案下載function
    数据库的分页问题
    如何手动删除归档日志
    ORA00257 archiver error. 错误的处理方法
    关于Change Data Capture(六)查询CDC信息
    Cognos 的技巧
    Structs工作原理
    strutsconfig.xml属性含义
    Oracle性能查询统计信息的SQL语句
  • 原文地址:https://www.cnblogs.com/adamhome/p/8722288.html
Copyright © 2020-2023  润新知