网络异常,图片无法展示
|
逐位比较
本身不改变 xx 和 yy,每次取不同的偏移位进行比较,不同则加一。
循环固定取满 3232 。
网络异常,图片无法展示
|
代码:
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; } } 复制代码
- 时间复杂度:O(C)O(C),CC 固定为 3232
- 空间复杂度:O(1)O(1)
右移统计
每次都统计当前 xx 和 yy 的最后一位,统计完则将 xx 和 yy 右移一位。
当 xx 和 yy 的最高一位 11 都被统计过之后,循环结束。
网络异常,图片无法展示
|
代码:
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; } } 复制代码
- 时间复杂度:O(C)O(C),CC 最多为 3232
- 空间复杂度:O(1)O(1)
lowbit
熟悉树状数组的同学都知道,lowbit
可以快速求得 xx 二进制表示中最低位 11 表示的值。
因此我们可以先将 xx 和 yy 进行异或,再统计异或结果中 11 的个数。
网络异常,图片无法展示
|
代码:
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; } } 复制代码
- 时间复杂度:O(C)O(C),CC 最多为 3232
- 空间复杂度:O(1)O(1)