前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 461.汉明距离 - JavaScript

LeetCode 461.汉明距离 - JavaScript

作者头像
心谭博客
发布2020-04-21 15:41:19
7490
发布2020-04-21 15:41:19
举报
文章被收录于专栏:YuanXin

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

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

注意:0 ≤ x,y <

解法 1:使用掩码

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

代码实现如下:

代码语言:javascript
复制
// 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 即可。

代码实现如下:

代码语言:javascript
复制
// 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 的个数》中也有应用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解法 1:使用掩码
  • 解法 2: 布赖恩·克尼根算法(推荐)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档