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

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

  • 题目
    • 面试题 05.06. 整数转换
    • 461 汉明距离
  • 解题
    • 解题一:按位比较
    • 解题二:使用异或,按位找 1
    • 解题三:使用异或,Brian Kernighan 算法

题目

面试题 05.06. 整数转换

LeetCode461 汉明距离 &《程序员面试金典》面试题 05.06. 整数转换_第1张图片

461 汉明距离

LeetCode461 汉明距离 &《程序员面试金典》面试题 05.06. 整数转换_第2张图片

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

解题

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

解题一:按位比较

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

在这里插入图片描述

你可能感兴趣的:(程序员面试金典,刷题笔记,位运算)