LeetCode探索(33):461-汉明距离

320 阅读1分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。

题目

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。

给你两个整数 xy,计算并返回它们之间的汉明距离。

示例 1:

输入:x = 1, y = 4
输出:2
解释:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑
上面的箭头指出了对应二进制位不同的位置。

示例 2:

输入:x = 3, y = 1
输出:1

提示:

  • 0 <= x, y <= 2^31 - 1

思考

这是一道有意思的题目,难度简单。

根据题意,两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。那么,我们如何统计汉明距离呢?我们可以借助异或运算 ^,两个整数异或的结果就是二进制位不同组成的数字,比如 2 ^ 3 === 1。然后再统计1的数量即可。

方法一是将数字与1进行与运算,可知数字的最低位是否为1,然后右移一位,再与1进行与运算。就这样循环下去,直至数字变为0为止。

方法二是将数字s与(s-1)进行与运算,得到的正是数字s中删去其二进制表示中最低位的结果。这也就是Brian Kernighan 算法。然后,判断数字是否变为0。不为0则继续这样循环下去,直至数字变为0为止。

解答

方法一:异或运算

var hammingDistance = function(x, y) {
  let res = 0, num = x ^ y
  while (num !== 0) {
    res += num & 1
    num >>= 1
  }
  return res
}

复杂度分析

  • 时间复杂度:O(logC),其中 C 是元素的数据范围,在本题中 logC=log2^31=31。
  • 空间复杂度:O(1)。

方法二:Brian Kernighan 算法

var hammingDistance = function(x, y) {
  let s = x ^ y, ret = 0
  while (s != 0) {
    s &= s - 1
    ret++
  }
  return ret
}

复杂度分析

  • 时间复杂度:O(logC),其中 C 是元素的数据范围,在本题中 logC=log2^31=31。
  • 空间复杂度:O(1)。

参考