LeetCode461 汉明距离 &《程序员面试金典》面试题 05.06. 整数转换

题目

面试题 05.06. 整数转换

在这里插入图片描述

461 汉明距离

在这里插入图片描述

上面两题要解决的是同一个问题。

解题

这个问题看似复杂,实则简单明了。要解决这个问题,就得设法找出两个数之间有哪些位不同。因为题目里给了数据的范围,最简单的是按位去比较。

解题一:按位比较

// javascript
var convertInteger = function(A, B) {
    let bitCnt = 0;
    for (let i = 0; i < 32; i++) {
        if ((A & 1) !== (B & 1)) {
            bitCnt++;
        }
        A >>= 1;
        B >>= 1;
    }
    return bitCnt;
};

解题二:使用异或,按位找 1

在异或操作的结果中,每个 1 代表 A 和 B 相应位不同。因此,要找出 A 和 B 有多少个不同的位,只要数一数 A^B 有几个位为 1。

注意要使用 >>> 而不是 >>,否则 负数 会进入无限循环。

var convertInteger = function(A, B) {
    let bitCnt = 0;
    let AxorB = A ^ B;
    while (AxorB !== 0) {
        if ((AxorB & 1) === 1) {
            bitCnt++;
        }
        AxorB >>>= 1;
    }
    return bitCnt;
};

在这里插入图片描述

解题三:使用异或,Brian Kernighan 算法

上面的代码已经很不错了,不过还可以做得更好。上面的做法是不断对 c 执行移位操作, 然后检查最低有效位,但其实可以不断翻转最低有效位,计算要多少次 c 才会变成 0操作 c = c & (c - 1) 会清除 c 的最低有效位

划重点!!记住它!!!

var convertInteger = function(A, B) {
    let bitCnt = 0;
    for (let C = A ^ B; C !== 0; C = C & (C - 1)) {
        bitCnt++;
    }
    return bitCnt;
};

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值