问题描述:
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x
和 y
,计算它们之间的汉明距离。
注意:
0 ≤ x
, y
< 231.
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
解法一:
暴力法:遍历32次,对两个数字的二进制对应位置进行比较。
解法二:
先将两个数字异或,然后计算1的个数。
思路:此题常规思路就是循环32次,然后依次判断每一位的值。但是这样肯定是不够的。所有有一种更加简便的方法。即:
我们**只需要将该数字与其减一之后的值进行与运算,然后再次循环,直到为0,其循环的次数就是该数字中1的个数。**原理就是n&n-1一定可以消去该数字最后一位的1,,大家可以这样理解,不管对于n中最后一个一的位置如何比如为…1000…(N个)假设1的后面有N个0,对于该数字减一而言就变成了…01111…(N个)后面的0全部就因为借位变成了1,此时将两个数字相与就会把最后一个1之后(包括1)全部变成了0.同理如此循环一定能将所有的1全部变成0,这样循环的次数就变成了消去1的次数,也就是1的个数。
此题面试常考(tx考过),大家可以记一记。
代码如下:
class Solution {
public:
int hammingDistance(int x, int y) {
int n = x^y;
int result = 0;
while(n != 0){
result++;
n = n & (n-1);
}
return result;
}
};