《LeetCode之每日一题》:42.汉明距离
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:42.汉明距离相关的知识,希望对你有一定的参考价值。
题目链接:
有关题目
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 2^31.
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置
题解
法一:内置位计数功能
思路:
大多数编程语言都内置了计算二进制表达中 11 的数量的函数。在工程中,我们应该直接使用内置函数。
在C++中内置位计数函数_builtin_popcount()用于计算一个 32 位无符号整数有多少个位为1
class Solution {
public:
int hammingDistance(int x, int y) {
return __builtin_popcount(x ^ y);
}
};
法二:移位实现位计数
代码一:
class Solution {
public:
int hammingDistance(int x, int y) {
int ret = x ^ y;//101
int res = 0;
for (int i = 0; i < 32; i++)
{
res += (ret >> i) & 1;
}
return res;
}
};
代码二:
class Solution {
public:
int hammingDistance(int x, int y) {
int ret = x ^ y, res = 0;
while(ret)
{
res += ret & 1;
ret >>= 1;
}
return res;
}
};
class Solution {
public:
int hammingDistance(int x, int y) {
int ans = 0;
while ((x | y) != 0)
{
int a = x & 1, b = y & 1;
ans += a ^ b;
x >>= 1;
y >>= 1;
}
return ans;
}
};
法三:Brian Kernighan 算法
参考官方题解
class Solution {
public:
int hammingDistance(int x, int y) {
int count = 0;
int ret = x ^ y;
for (;ret != 0;)
{
ret &= ret - 1;
count++;
}
return count;
}
};
法四:lowbit
思路:
lowbit可以快速求得x二进制中最低位二进制1表示的值。
例如:lowbit(5)//101
输出1
lowbit(6)
输出2
class Solution {
public:
int lowbit (int x)
{
return x & (-x);
//或者return x - (x & (x - 1))
}
int hammingDistance(int x, int y) {
int ans = 0;
for (int i = x ^ y; i > 0; i -= lowbit(i))
ans++;
return ans;
}
};
以上是关于《LeetCode之每日一题》:42.汉明距离的主要内容,如果未能解决你的问题,请参考以下文章