zoukankan      html  css  js  c++  java
  • 整数中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 }
  • 相关阅读:
    linux内核中GNU C和标准C的区别
    linux内核中GNU C和标准C的区别
    Getting start with dbus in systemd (02)
    Getting start with dbus in systemd (01)
    Getting start with dbus in systemd (03)
    物理内存相关的三个数据结构
    数据类型对应字节数(32位,64位 int 占字节数)
    Linux kernel 内存
    共模电感的原理以及使用情况
    [原创]DC-DC输出端加电压会烧毁
  • 原文地址:https://www.cnblogs.com/adamhome/p/8722288.html
Copyright © 2011-2022 走看看