《LeetCode之每日一题》:42.汉明距离

汉明距离


题目链接: 汉明距离

有关题目

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

给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 2^31.
示例:

输入: x = 1, y = 4

输出: 2

解释:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑
上面的箭头指出了对应二进制位不同的位置

题解

法一:内置位计数功能

思路:
大多数编程语言都内置了计算二进制表达中 11 的数量的函数。在工程中,我们应该直接使用内置函数。
在C++中内置位计数函数_builtin_popcount()用于计算一个 32 位无符号整数有多少个位为1
class Solution {
public:
    int hammingDistance(int x, int y) {
        return __builtin_popcount(x ^ y);
    }
};

在这里插入图片描述
在这里插入图片描述

法二:移位实现位计数
代码一:

class Solution {
public:
    int hammingDistance(int x, int y) {
        int ret = x ^ y;//101
        int res = 0;
        for (int i = 0; i < 32; i++)
        {
            res += (ret >> i) & 1;
        }
        return res;
    }
};

代码二:

class Solution {
public:
    int hammingDistance(int x, int y) {
       int ret = x ^ y, res = 0;
       while(ret)
       {
           res += ret & 1;
            ret >>= 1;
       }
       return res;
    }
};
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;
    }
};

在这里插入图片描述
在这里插入图片描述
法三:Brian Kernighan 算法
参考官方题解
在这里插入图片描述

class Solution {
public:
    int hammingDistance(int x, int y) {
        int count = 0;
        int ret = x ^ y;
        for (;ret != 0;)
        {
            ret &= ret - 1;
            count++;
        }
        return count;
    }
};

在这里插入图片描述

在这里插入图片描述
法四:lowbit

思路:
lowbit可以快速求得x二进制中最低位二进制1表示的值。
例如:lowbit(5)//101
输出1
lowbit(6)
输出2
class Solution {
public:
    int lowbit (int x)
    {
        return x & (-x);
        //或者return x - (x & (x - 1))
    }
    int hammingDistance(int x, int y) {
        int ans = 0;
        for (int i = x ^ y; i > 0; i -= lowbit(i))
            ans++;
            return ans;
    }
    
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值