Skip to content

Files

Latest commit

fa73a73 · Jan 16, 2024

History

History

面试题15. 二进制中1的个数

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Jan 16, 2024
Aug 13, 2022
Jan 13, 2024
Jan 31, 2023
Feb 13, 2022
Feb 13, 2022
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024

题目描述

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量).)。

 

提示:

  • 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
  • 在 Java 中,编译器使用 二进制补码 记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3

 

示例 1:

输入:n = 11 (控制台输入 00000000000000000000000000001011)
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:n = 128 (控制台输入 00000000000000000000000010000000)
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输入:n = 4294967293 (控制台输入 11111111111111111111111111111101,部分语言中 n = -3)
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

 

提示:

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

 

注意:本题与主站 191 题相同:https://leetcode.cn/problems/number-of-1-bits/

解法

方法一:位运算

由于 n & (n - 1) 会消除 n 的二进制表示中的最后一个 1 ,因此对 n 重复该操作,直到 n 变成 0 ,此时的操作次数即为 n 的二进制表示中的 1 的个数。

或者,我们可以用 lowbit 函数来获取 n 的二进制表示中的最后一个 1 ,然后将 n 减去这个 1 ,再重复该操作,直到 n 变成 0 ,此时的操作次数即为 n 的二进制表示中的 1 的个数。lowbit(x)=x&(-x)

时间复杂度 O ( log n ) ,空间复杂度 O ( 1 ) 。其中 n 为输入的整数。

class Solution:
    def hammingWeight(self, n: int) -> int:
        return n.bit_count()
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int ans = 0;
        while (n != 0) {
            n &= n - 1;
            ++ans;
        }
        return ans;
    }
}
class Solution {
public:
    int hammingWeight(uint32_t n) {
        int ans = 0;
        while (n) {
            n &= n - 1;
            ++ans;
        }
        return ans;
    }
};
func hammingWeight(num uint32) (ans int) {
	for num != 0 {
		num &= num - 1
		ans++
	}
	return
}
/**
 * @param {number} n - a positive integer
 * @return {number}
 */
var hammingWeight = function (n) {
    let ans = 0;
    while (n != 0) {
        n &= n - 1;
        ++ans;
    }
    return ans;
};
public class Solution {
    public int HammingWeight(uint n) {
        int ans = 0;
        while (n != 0) {
            n &= (n - 1);
            ++ans;
        }
        return ans;
    }
}

方法二

class Solution:
    def hammingWeight(self, n: int) -> int:
        ans = 0
        while n:
            n &= n - 1
            ans += 1
        return ans
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int ans = 0;
        while (n != 0) {
            n -= n & -n;
            ++ans;
        }
        return ans;
    }
}
class Solution {
public:
    int hammingWeight(uint32_t n) {
        int ans = 0;
        while (n != 0) {
            n -= n & -n;
            ++ans;
        }
        return ans;
    }
};
func hammingWeight(num uint32) (ans int) {
	for num != 0 {
		num -= num & -num
		ans++
	}
	return
}

方法三

class Solution:
    def hammingWeight(self, n: int) -> int:
        ans = 0
        while n:
            n -= n & (-n)
            ans += 1
        return ans