【前端也得会算法】- 461. 汉明距离 [ 简单 ]

179 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

给你两个整数 x 和 y,计算并返回它们之间的汉明距离。

示例

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


    示例 2:
    输入: x = 3, y = 1
    输出: 1

提示:

  • 0 <= x, y <= 231 - 1

二、题解:

方法一 数组计数法

  • 原理。主要是通过toString(2)转化为2进制字符串,再通过数组补齐'0'的方式,实现长度一致可以进行计数。

代码:

var hammingDistance = function(x, y) {
    let  x2 = x.toString(2).split("")
    let  y2 = y.toString(2).split("")
    if(x2.length != y2.length){
        let diff = Math.abs(x2.length-y2.length)
        let arr = x2.length > y2.length?y2:x2
        for(let i=0;i<diff;i++){
            arr.unshift('0')
        }
    }
    let count = 0
    for(let i=0;i<x2.length;i++){
        if(x2[i] != y2[i]){
            count++
        }
    }
    
    return count
};

image.png

方法二 位运算法

  • 原理。通过异或(^)位运算得到不同位,在使用位循环进行计算。
  • 思路。
    • 第一步取得x ^ y得到不同位的10进制数;
    • 第二步通过while循环进行遍历;
    • 第三步通过s & 1(&运算类似于最后一位相乘),取得s最后一位的运算结果,判断是否为1,为1则+1,否则则+0;
    • 第四步s >>= 1则将s右移一位,进行下一位判断并改变s的值。

代码:

var hammingDistance = function (x, y) {
    let s = x ^ y, result = 0;
    while (s != 0) {
        result += (s & 1);
        s >>= 1;
    }
    return result;
};

image.png

方案比较

  • 方案一使用的是数组计数法,但是由于有数组补齐操作,显得繁琐,且多了一次循环
  • 方案二使用的是位运算法,通过异或(^)位运算得到不同位,在使用位循环进行计算,且只有一次循环,所以效率稍高。

三、总结

  • 此题可以数组计数法位运算法两种方案
  • 出入栈法主要是主要是通过toString(2)转化为2进制字符串,再通过数组补齐'0'的方式,实现长度一致可以进行计数。
  • 遍历排序法通过异或(^)位运算得到不同位,在使用位循环进行计算。

文中如有错误,欢迎在评论区指正