LeetCode 第 461 题“汉明距离”是一道经典的位运算问题,旨在计算两个整数在二进制表示下不同位的个数。题目要求简单直接:给定两个整数 x 和 y,计算并返回它们之间的汉明距离。
汉明距离的定义为两个等长字符串对应位置不同字符的个数。在本题中,我们将其应用于整数的二进制表示。例如,对于 x = 1(二进制 0001)和 y = 4(二进制 0100),它们在第一和第三位不同,因此汉明距离为 2。
以下是几种常见的解法,从暴力到优化,逐步深入。
最直观的方法是逐位比较 x 和 y 的二进制位。我们可以通过循环 32 次(假设为 32 位整数),每次检查最低位是否相同,然后右移一位。
步骤:
x & 1 和 y & 1 获取)。x >>= 1, y >>= 1)。时间复杂度:O(1),因为固定循环 32 次。
空间复杂度:O(1)。
利用位运算中的异或(XOR)操作,可以更高效地解决问题。异或运算的规则是:相同为 0,不同为 1。因此,将 x 和 y 进行异或后,结果中 1 的个数即为汉明距离。
步骤:
z = x ^ y。z & (z - 1) 不断清除最低位的 1,直到 z 变为 0。每次操作计数器加 1。时间复杂度:O(1),因为整数位数固定。
空间复杂度:O(1)。
许多编程语言提供了内置函数来统计二进制中 1 的个数(例如 Java 的 Integer.bitCount() 或 Python 的 bin().count('1'))。这种方法代码简洁,但底层实现通常基于高效算法。
以下是方法二的 Python 实现,使用 Brian Kernighan 算法:
def hammingDistance(x: int, y: int) -> int:
z = x ^ y
count = 0
while z:
z &= z - 1 # 清除最低位的 1
count += 1
return count
汉明距离在计算机科学中有广泛的应用,例如:
LeetCode 461 题通过位运算的核心技巧,帮助开发者熟悉异或操作和二进制处理。掌握此类问题不仅能提升算法能力,还能加深对计算机底层原理的理解。建议在解题时优先考虑异或结合 Brian Kernighan 算法,以实现高效且简洁的解决方案。
如若转载,请注明出处:http://www.vipwujin.com/product/56.html
更新时间:2026-02-24 10:43:49