题目来源:链接: https://leetcode-cn.com/problems/hamming-distance/submissions/].
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 2^31
示例 2:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
最初的想法是暴力解法,分别求出x,y对应的二进制数,放入容器中,逐一比较。
很尴尬的是 报错,原因是 没有包含 头文件 vector?
最初版代码如下:
class Solution {
public:
int hammingDistance(int x, int y) {
vector<int> A;
vector<int> B;
int count = 0;
while(x > 0)
{
int tmp1 = x % 2;
int tmp2 = y % 2;
A.push_back(tmp1);
A.push_back(tmp1);
x = x / 2;
y = y / 2;
}
for(int i = 0; i < A.size(); i++)
{
if(A[i] != B[i])
{
count++;
}
else
{
continue;
}
}
return count;
};
参考了几位大神的代码:
方案1:
class Solution {
public:
int hammingDistance(int x, int y) {
int k = x^y;
int res = 0;
while(k != 0)
{
if(k%2 == 1)
{
res++;
}
k = k / 2;
}
return res;
}
};
执行用时: 8 ms, 在Hamming Distance的C++提交中击败了17.40% 的用户
内存消耗: 8.9 MB, 在Hamming Distance的C++提交中击败了0.00% 的用户
方案2:
class Solution {
public:
int hammingDistance(int x, int y) {
int k = x ^ y;
int res = 0;
while(k){
if(k&1) res ++;
k >>= 1;
}
return res;
}
};
明天待补充。。。先回去睡觉先。。。
知识点:
1. 十进制转换成二进制的方法:
a.包含stdlib.h 头文件 直接用 itoa 函数 , itoa(a,str,2); //2即是代表转换为2进制
b.代码如下
int transfer(int x) // 10进制转换成2进制方法
{
int p = 1,y = 0, yushu;
while(1)
{
yushu = x % 2; // % 是 取余
x /= 2; // / 是 整除
y += yushu * p;
p *= 10;
if( x < 2)
{
y += x * p;
break;
}
}
return y;
}
2. 汉明距离实现思路:
1. 将两个给定的数进行异或(^)运算后保存在变量a中,则汉明距离就是二进制a中1的个数;
2. 当a不为0时,和0x01进行按位与(&)运算,如果结果为1,则统计变量加一
3. 将a右移一位,重复第02步
2019/3/2 胡云层 于南京 10