問題描述:
兩個整數之間的漢明距離指的是這兩個數字對應二進制位不同的位置的數目。
給出兩個整數 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;
}
};