【前端面试常见算法题系列】461. 汉明距离(简单)

189 阅读1分钟

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

一、题目描述

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

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

示例 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

二、思路分析

题目要求计算两个数字转换为二进制之后,不同的位置的 1 的个数。

由异或运算我们知道,参与运算的两个数,满足:

  • 0^0 = 0
  • 1^0 = 1
  • 0^1 = 1
  • 1^1 = 0 因此,如果两个二进制数字进行异或运算,同一对位的数字 1 会变为 0 ,不同对位的 1 不会受影响。那么我们只要遍历这两个二进制数字每一位上的元素,遇到 1 就将答案 +1 即可。

现在有两个问题,①如何将两个整数转换为二进制数;②如何遍历二进制数上的每一位元素。

  • ^ 运算符会将参与运算的数字转换为二进制数,运算完毕之后将结果转换为十进制。
  • ②使用 >> ,每次将二进制数右移一位(相当于 / ,例如 a >>= 1 等价于 a /= 2 ),直到为 0 为止。【>> 运算符同样会将数字转换为二进制数再进行运算,然后将运算后的结果转换回来】。

三、AC 代码

/**
 * @param {number} x
 * @param {number} y
 * @return {number}
 */
var hammingDistance = function(x, y) {
    let s = x ^ y;
    let res = 0;
    while (s) {
        res += s & 1;
        s >>= 1;
    }
    return res;
};