LeetCode 461.汉明距离

📖博客原文 :《LeetCode 461.汉明距离 - JavaScript》

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

题目描述:给出两个整数 x 和 y,计算它们之间的汉明距离。

注意:
0 ≤ x,y < 2^31.

解法 1:使用掩码

这里使用掩码对 x 和 y 进行 & 运算。若 x 和 y 在此位上的二进制不同,那么相与的结果不同。

代码实现如下:

// ac地址:https://leetcode-cn.com/problems/hamming-distance/
// 原文地址:https://xxoo521.com/2020-03-04-hamming-distance/
var hammingDistance = function(x, y) {
    let dis = 0;
    let mask = 0x01;
    let times = 0;
    while (times < 31) {
        if ((x & mask) !== (y & mask)) {
            ++dis;
        }
        mask = mask << 1;
        ++times;
    }

    return dis;
};

解法 2: 布赖恩·克尼根算法(推荐)

我也是看了官方的题解才知道这算法竟然有名字(震惊),它用于快速判断二进制中有多少个 1。它是借助 num & (num - 1) 来直接去除 num 的二进制中最右边的 1。

相较于普通移位判断,布赖恩·克尼根算法是高效的:它直接跳过了二进制中的 0,有多少个 1 就判断多少次。

在使用布赖恩·克尼根算法之前,需要借助 ^ 运算,让不同的位变 1,相同的位变 0。最后再统计二进制中有多少 1 即可。

代码实现如下:

// ac地址:https://leetcode-cn.com/problems/hamming-distance/
// 原文地址:https://xxoo521.com/2020-03-04-hamming-distance/
/**
 * @param {number} x
 * @param {number} y
 * @return {number}
 */
var hammingDistance = function(x, y) {
    let v = x ^ y; // 异或:相同位为0,不同位为1
    let dis = 0;
    while (v) {
        v = v & (v - 1);
        ++dis;
    }
    return dis;
};

注意:这种思路在《剑指 offer - 二进制中 1 的个数》中也有应用。

更多资料

若有错误,欢迎指正。若对您有帮助,请给个「关注+点赞」,您的支持是我更新的动力 👇

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 461. 汉明距离两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计...
    杏仁小核桃阅读 329评论 0 1
  • 【题目描述】两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们...
    1江春水阅读 204评论 0 0
  • LeetCode算法题目 题目 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数...
    Shenjiming阅读 236评论 0 1
  • 题目 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y,计算它们之间...
    LonnieQ阅读 120评论 0 1
  • 题目描述 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y,计算它们...
    秀叶寒冬阅读 125评论 0 2