Every day a leetcode
题目来源:461. 汉明距离
解法1:模拟
先将x和y转为为对应二进制的字符串,再遍历两个字符串进行比较。
代码:
/*
* @lc app=leetcode.cn id=461 lang=cpp
*
* [461] 汉明距离
*/
// @lc code=start
class Solution
{
public:
string trans(int n)
{
string result = "";
while (n > 0)
{
result += '0' + n % 2;
n /= 2;
}
reverse(result.begin(), result.end());
return result;
}
int hammingDistance(int x, int y)
{
string sx = trans(x);
string sy = trans(y);
int ans = 0;
int i = sx.size() - 1;
int j = sy.size() - 1;
while (i >= 0 || j >= 0)
{
char item_x = i >= 0 ? sx[i] : '0';
char item_y = j >= 0 ? sy[j] : '0';
if (item_x != item_y)
ans++;
i--;
j--;
}
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(lognlogn),数字转换为字符串用时O(logn),得到的字符串长度为logn,遍历字符串用时O(logn),所以总的时间复杂度为O(lognlogn)。
空间复杂度:O(logn),字符串的存储空间为O(logn)。
解法2:异或
两个整数之间的汉明距离是对应位置上数字不同的位数。
根据以上定义,我们使用异或运算,记为 ⊕,当且仅当输入位不同时输出为 1。
计算 x 和 y 之间的汉明距离,可以先计算 x⊕y,然后统计结果中等于 1 的位数。
代码:
class Solution
{
public:
int hammingDistance(int x, int y)
{
return __builtin_popcount(x ^ y);
}
};
结果:
复杂度分析:
时间复杂度:O(1),不同语言的实现方法不一,我们可以近似认为其时间复杂度为O(1)。
空间复杂度:O(1)。