zoukankan      html  css  js  c++  java
  • 剑指offer例题——二进制中1的个数

    题目:输入一个整数,输出该二进制表示中1的个数。其中负数用补码表示。

    首先明确补码的定义:

    原码 反码 补码

    将最高位作为符号位(0表示正,1表示负),

    其它数字位表达数值本身的绝对值的数字表示方式

    如果是正数,则表示方法和原码一样;

    如果是负数,符号位不变,其余各位取反。

    如果是正数,则表示方法和原码一样;

    如果是负数,则将数字的反码加上1

    (相当于将原码数值位取反然后在最低位加1)

    0的反码、补码都为零。

    原数 原码 反码 补码
    6 00000110 00000110 00000110
    -6 10000110 11111001 11111010

    代码:

    自己的代码:

     1 import java.lang.*;
     2 public class Solution {
     3     public int NumberOf1(int n) {
     4         String temp = Integer.toBinaryString(n);
     5         int len = temp.length();
     6         int zs = 0;
     7         int cur = len;
     8         if (n>0){
     9             for(int i = 0;i < cur; i++){
    10             char ch = temp.charAt(i);
    11             if(ch == '1')
    12                 zs = zs+1;
    13             }
    14             return zs;
    15         }
    16         else if(n == 0)
    17             return 0;
    18         else{
    19             int fz = 0;
    20             for(int j = len;j > 0 ; j--){
    21                 char ch = temp.charAt(j-1);
    22                 if(ch == '1')
    23                 {}
    24                 else
    25                 {
    26                     zs = zs + 1;
    27                     cur = j;
    28                     break;
    29                 }
    30             }
    31             for(int i = 0;i < cur; i++){
    32             char ch = temp.charAt(i);
    33             if(ch == '1')
    34                 zs = zs+1;
    35             }
    36             return zs;
    37         }
    38     }
    39 }

    运行总是报错,于是参考别人讨论中的方法,发现Java中自带这个函数:

    1 public class Solution {
    2     public int NumberOf1(int n) {
    3         return Integer.bitCount(n);
    4     }
    5 }

    能逮着耗子的就是好猫~Java学习的首要任务就是掌握其自带函数,这样才能更加省力地学习。

    同时学习了讨论中强推程序:

     1 public class Solution {
     2     public int NumberOf1(int n) {
     3         int count = 0;
     4         while(n!= 0){
     5             count++;
     6             n = n & (n - 1);
     7          }
     8         return count;
     9     }
    10 }

    这里是利用了一个二进制数字本身性质:

    链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8
    来源:牛客网
            如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。

            举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
    有待进一步研究~另外自己的示例是由问题的~
  • 相关阅读:
    Spring spEL
    Spring 使用外部部署文件
    Spring 自动装配
    spring 属性配置细节
    hdu 1054 Strategic Game
    fzu 2037 Maximum Value Problem
    将博客搬至CSDN
    HDU 4714 Tree2Cycle
    HDU 1009 The Shortest Path in Nya Graph
    POJ 1942 Paths on a Grid 组合数的优化
  • 原文地址:https://www.cnblogs.com/10081-AA/p/10544457.html
Copyright © 2011-2022 走看看