初级算法位运算问题
leetcode初级算法中的位运算问题
一. 位1的个数(汉明重量)
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串00000000000000000000000000001011 中,共有三位为 ‘1’。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串00000000000000000000000010000000 中,共有一位为 ‘1’。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串11111111111111111111111111111101 中,共有 31 位为 ‘1’。
提示:
输入必须是长度为 32 的 二进制串 。
进阶:
如果多次调用这个函数,你将如何优化你的算法?
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn1m0i/
来源:力扣(LeetCode)
解法
1.循环移位法
思路:
- 1的二进制数是0001,与n进行与运算的结果表示了n的最后一位是否为1;
- 将二进制1左移一位变成0010,与运算结果表示n的倒数第二位是否为1;
- 因为二进制数长度32,所以进行32次移位并比较,分别获得了n每一位的数值情况。
class Solution:
def hammingWeight(self, n: int) -> int:
count = 0
for i in range(32):
# 每次将1移位表示2的i次方,使得n与第i为1其余为0的二进制数进行与运算,结果表示了n的第i位是否为1
if n & 1<<i :
count += 1
return count
复杂度分析:
- 时间复杂度: O ( k ) O(k) O(k),其中 k k k 是 int \texttt{int} int 型的二进制位数, k = 32 k=32 k=32。我们需要检查 n n n 的二进制位的每一位,一共需要检查 32 位。
- 空间复杂度: O ( 1 ) O(1) O(1),储存若干常数变量。
2.Brian Kernighan 算法
思想:
将二进制数n和n-1进行与运算的结果就是将二进制n的最后一个元素1变成0。
- 若n最后一位为1,则n-1恰好是将1变成0,与