「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。
题目
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
示例 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)。