力扣461. 汉明距离
题目描述:
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
示例一:
输入:x = 1, y = 4
输出:2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
示例二:
输入:x = 3, y = 1
输出:1
提示:
0 <= x, y <= 2^31 - 1
思路:没有什么特殊的技巧,熟悉补码即可。
解法一:库函数直接秒掉。
class Solution {
public:
int hammingDistance(int x, int y) {
return __builtin_popcount(x ^ y);
}
};
知识补充:
1、函数原型: int __builtin_popcount(int num)
返回num在二进制表示下“1”的个数。
C/C++自带,无需包含特殊的库文件
2、汉明距离可以通过异或位运算快速得出
解法二:自己写一个__builtin_popcount函数
class Solution {
public:
int f(int n){
int jie = 0;
while (n) {
jie+= n&1;//获得二进制最右边的数字
n>>= 1; //移位操作
}
return jie;
}
int hammingDistance(int x, int y) {
return f(x ^ y);
}
};
解法三:Brian Kernighan 算法(快速去掉二进制表示的最后一位)
class Solution {
public:
int hammingDistance(int x, int y) {
int n = x ^ y, jie = 0;
while (n) {
n&= n-1;
jie++;
}
return jie;
}
};
解法四:字符串模拟:我最开始入力扣的解法。
class Solution {
public:
string f(int n){
string jie="";
while(n){
int tmp=n%2;
jie+=to_string(tmp);
n/=2;
}
return jie;
}
int hammingDistance(int x, int y) {
int cnt=0;
string a=f(x);
string b=f(y);
int n=max(a.size(),b.size());
while(a.size()<n)a+='0';
while(b.size()<n)b+='0';
for(int i=0;i<n;i++){
if(a[i]!=b[i])cnt++;
}
return cnt;
}
};