力扣461. 汉明距离

在这里插入图片描述
力扣461. 汉明距离
题目描述:

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。

示例一:

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

示例二:

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

提示:

0 <= x, y <= 2^31 - 1

思路:没有什么特殊的技巧,熟悉补码即可。
解法一:库函数直接秒掉。

class Solution {
public:
    int hammingDistance(int x, int y) {
        return __builtin_popcount(x ^ y);
    }
};

知识补充:
1、函数原型: int __builtin_popcount(int num)
返回num在二进制表示下“1”的个数。
C/C++自带,无需包含特殊的库文件
2、汉明距离可以通过异或位运算快速得出

解法二:自己写一个__builtin_popcount函数

class Solution {
public:
int f(int n){
        int jie = 0;
        while (n) {
            jie+= n&1;//获得二进制最右边的数字
            n>>= 1;   //移位操作
        }
        return jie;
}
    int hammingDistance(int x, int y) {
        return f(x ^ y);
    }
};

解法三:Brian Kernighan 算法(快速去掉二进制表示的最后一位)

class Solution {
public:
    int hammingDistance(int x, int y) {
        int n = x ^ y, jie = 0;
        while (n) {
            n&= n-1;
            jie++;
        }
        return jie;
    }
};

解法四:字符串模拟:我最开始入力扣的解法。

class Solution {
public:
string f(int n){
    string jie="";
    while(n){
        int tmp=n%2;
        jie+=to_string(tmp);
        n/=2;
    }
    return jie;
}
    int hammingDistance(int x, int y) {
    int cnt=0;
    string a=f(x);
    string b=f(y);
    int n=max(a.size(),b.size());
    while(a.size()<n)a+='0';
    while(b.size()<n)b+='0';
    for(int i=0;i<n;i++){
        if(a[i]!=b[i])cnt++;
    }
    return cnt;
    }
};

以上解法都能达到100%的时间击败率,但这里,我们最重要的是理解汉明距离,及位运算相关操作

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0<Solving)1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值