zoukankan      html  css  js  c++  java
  • 剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数

    请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

    示例 1:

      输入:00000000000000000000000000001011
      输出:3
    解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

    示例 2:

      输入:00000000000000000000000010000000
      输出:1
    解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

    示例 3:

      输入:11111111111111111111111111111101
      输出:31
    解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

     

    方法一:逐位判断

    根据 与运算 定义,设二进制数字 n ,则有:
    若n&1=0 ,则 n 二进制 最右一位 为 0 ;
    若 n&1=1 ,则 n 二进制 最右一位 为 1 。
    根据以上特点,考虑以下 循环判断 :
    判断 n 最右一位是否为 1 ,根据结果计数。
    将 n 右移一位(本题要求把数字 n 看作无符号数,因此使用 无符号右移 操作)。
    算法流程:
    初始化数量统计变量 res = 0。
    循环逐位判断: 当 n = 0时跳出。
    res += n & 1 : 若n&1=1 ,则统计数 resres 加一。
    n >>= 1 : 将二进制数字 n无符号右移一位 。

     

    代码:

    class Solution {
        public int hammingWeight(int n) {
            int res = 0;
            while(n != 0) {
                res += n & 1;
                n >>= 1;
            }
            return res;
        }
    }

     

     

    方法二:巧用n&(n1)

    (n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,此 1 右边的 0 都变成 1 。
    n&(n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,其余不变。

     

    public class Solution {
        public int hammingWeight(int n) {
            int res = 0;
            while(n != 0) {
                res++;
                n &= n - 1;
            }
            return res;
        }
    }

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13546596.html

  • 相关阅读:
    Flask莫名其妙特别慢
    MySQL老是提示视图没有主键
    Mysql写入中文出错
    Sqlite向MySql导入数据
    大智慧专业财务PFFIN(N,M)函数N的取值一览表
    js的技巧
    拍拍贷年化收益率的推算
    Sqlite的多表连接更新
    Kali Linux 64位架构安装Veil-Evasion
    修改Kali Linux 2020.1主题颜色
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13546596.html
Copyright © 2011-2022 走看看