461.汉明距离

【LetMeFly】461.汉明距离

力扣题目链接:https://leetcode.cn/problems/hamming-distance/

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。

给你两个整数 xy,计算并返回它们之间的汉明距离。

 

示例 1:

输入:x = 1, y = 4
输出:2
解释:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑
上面的箭头指出了对应二进制位不同的位置。

示例 2:

输入:x = 3, y = 1
输出:1

 

提示:

  • 0 <= x, y <= 231 - 1

方法一:位运算

我们只需要按照题意,分别提取出$x$和$y$的每一位,看看它们是否相等。

如果不相等,答案数量+1

怎么“提取”出$x$在二进制下的某一位呢?

假设我们要提取$x$的二进制下从低到高的第$i + 1$位,那么我们可以构造一个用来进行与运算的数

1
int mask = 1 << i;

这样$mask$在二进制下就是$1000…0$

我们用$x$与$mask$进行与运算,得到的就是$x$的这一位以及后面的数个$0$

  • 时间复杂度$O(C)$,其中$C=31$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int hammingDistance(int x, int y) {
int ans = 0;
for (int i = 0; i < 31; i++) {
int mask = 1 << i;
ans += ((x & mask) != (y & mask));
}
return ans;
}
};

方法二:还是位运算

方法二类似方法一,不同之处是“取出某一位”的方式

方法二中,我们将$x$右移$i$位,再与$1$进行与运算,就得到了$x$的第$i+1$位

1
(x >> i) & 1;
  • 时间复杂度$O(C)$,其中$C=31$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
class Solution {
public:
int hammingDistance(int x, int y) {
int ans = 0;
for (int i = 0; i < 31; i++) {
ans += (((x >> i) & 1) != ((y >> i) & 1));
}
return ans;
}
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127510681


461.汉明距离
https://blog.letmefly.xyz/2022/10/25/LeetCode 0461.汉明距离/
作者
Tisfy
发布于
2022年10月25日
许可协议