693. Binary Number with Alternating Bits

n ^ (n >> 1):判断是否相邻bit都不同,若不同则异或结果全为位运算 - 图1
not a & (a + 1):判断是否所有bit都是位运算 - 图2

  1. class Solution:
  2. def hasAlternatingBits(self, n: int) -> bool:
  3. return not (a := n ^ (n >> 1)) & (a + 1)
  • 时间复杂度:位运算 - 图3
  • 空间复杂度:位运算 - 图4

461. Hamming Distance

Approach I** 逐位比较
i:二进制位向右移动的
bit**位数

  1. class Solution:
  2. def hammingDistance(self, x: int, y: int) -> int:
  3. return sum(1 for i in range(32) if x >> i & 1 != y >> i & 1)
  • 时间复杂度:位运算 - 图5固定为位运算 - 图6
  • 空间复杂度:位运算 - 图7

Approach II** 位移统计**
bin(num):得到的二进制表示的字符串是0bxxxxxx

  1. class Solution:
  2. def hammingDistance(self, x: int, y: int) -> int:
  3. return sum(1 for i in range(len(bin(max(x, y))) - 2) if (x >> i & 1) ^ (y >> i & 1))
  • 时间复杂度:位运算 - 图8固定为位运算 - 图9
  • 空间复杂度:位运算 - 图10

Approach II** lowbit**

  1. class Solution:
  2. def hammingDistance(self, x: int, y: int) -> int:
  3. return bin(x ^ y).count('1')
  1. class Solution:
  2. def hammingDistance(self, x: int, y: int) -> int:
  3. def lowbit(x): # 找到x最低位的1表示的数
  4. return x & -x
  5. res = 0
  6. i = x ^ y
  7. while i:
  8. i -= lowbit(i)
  9. res += 1
  10. return res
  • 时间复杂度:位运算 - 图11固定为位运算 - 图12
  • 空间复杂度:位运算 - 图13

477. Total Hamming Distance

数据量为位运算 - 图14,使用暴力解法位运算 - 图15两两匹配计算会超出时间限制。
位运算 - 图16:转换思路,考虑根据每一bit位来累积计算总汉明距离;对于每一个num,只考虑在nums中的其他数中有多少个第位运算 - 图17位与其不同,而不需要关心具体是哪些数。

1622166123-MiinFf-image.png

  1. class Solution:
  2. def totalHammingDistance(self, nums: List[int]) -> int:
  3. res = 0
  4. for i in range(32): # 对于每一个bit位(共32位)
  5. cnt_0 = cnt_1 = 0
  6. for num in nums: # 遍历所有num,计算当前bit位0和1的数量
  7. if num >> i & 1: # 采用位移的方式逐位累积
  8. cnt_1 += 1
  9. else:
  10. cnt_0 += 1
  11. res += cnt_0 * cnt_1
  12. return res
  • 时间复杂度:位运算 - 图19固定为位运算 - 图20
  • 空间复杂度:位运算 - 图21

136. Single Number

异或运算的性质:

  1. 位运算 - 图22
  2. 位运算 - 图23
  3. 位运算 - 图24 位运算 - 图25 交换律 & 结合律

位运算 - 图27

  1. class Solution:
  2. def singleNumber(self, nums: List[int]) -> int:
  3. xor = 0
  4. for num in nums:
  5. xor ^= num
  6. return xor
  • 时间复杂度:位运算 - 图28
  • 空间复杂度:位运算 - 图29