本文正在参加「Java主题月 – Java 刷题打卡」,详情查看 活动链接
逐位比较
本身不改变 和 ,每次取不同的偏移位进行比较,不同则加一。
循环固定取满 。
代码:
class Solution {
public int hammingDistance(int x, int y) {
int ans = 0;
for (int i = 0; i < 32; i++) {
int a = (x >> i) & 1 , b = (y >> i) & 1;
ans += a != b ? 1 : 0;
}
return ans;
}
}
复制代码
- 时间复杂度:, 固定为
- 空间复杂度:
右移统计
每次都统计当前 和 的最后一位,统计完则将 和 右移一位。
当 和 的最高一位 都被统计过之后,循环结束。
代码:
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;
}
}
复制代码
- 时间复杂度:, 最多为
- 空间复杂度:
lowbit
熟悉树状数组的同学都知道,lowbit
可以快速求得 二进制表示中最低位 表示的值。
因此我们可以先将 和 进行异或,再统计异或结果中 的个数。
代码:
class Solution {
int lowbit(int x) {
return x & -x;
}
public int hammingDistance(int x, int y) {
int ans = 0;
for (int i = x ^ y; i > 0; i -= lowbit(i)) ans++;
return ans;
}
}
复制代码
- 时间复杂度:, 最多为
- 空间复杂度:
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END