2021 年 06 月 31 日 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/submissions/

题目

描述

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

示例

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

示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。

示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。

提示

  • 输入必须是长度为 32 的 二进制串 。

    解答

    解答1

  • i 从 0 开始计算,将 n 的在二进制中的当前位 i 与 2^i 进行与计算,如果当前位不是 1 则返回 0,如 i= 2 时 2^3 二进制为 1000 只有当 n 的第 3 位为 1 时进行与计算才不为 0

    1. /**
    2. * @param {number} n - a positive integer
    3. * @return {number}
    4. */
    5. var hammingWeight = function(n) {
    6. let ret = 0
    7. for(let i = 0; i < 32; i ++){
    8. if((n & (1 << i)) !== 0){
    9. ret ++
    10. }
    11. }
    12. return ret
    13. };

    解答2

  • 对 n & (n - 1) 进行位运算,则将 n 的二进制中的最低位的 1 变为 0

    • 7(111) & 6(110) = 6(110)
    • 6(110) & 5(101) = 4(100)
    • 5(101) & 4(100) = 4(100)
      /**
      * @param {number} n - a positive integer
      * @return {number}
      */
      var hammingWeight = function(n) {
      let ret = 0
      while(n !== 0){
         n &= n - 1
         ret ++
      }
      return ret
      };
      

      解答3

  • 使用正则表达式解

    /**
    * @param {number} n - a positive integer
    * @return {number}
    */
    var hammingWeight = function(n) {
      return (n.toString(2).match(/1/g) || '').length
    };