LeetCode 0461. 汉明距离

45 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

方法一:位运算

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

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

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

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

int mask = 1 << i;

这样maskmask在二进制下就是1000...01000...0

我们用xxmaskmask进行与运算,得到的就是xx的这一位以及后面的数个00

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

AC代码

C++

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;
    }
};

方法二:还是位运算

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

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

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

AC代码

C++

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:letmefly.blog.csdn.net/article/det…