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
};
方法二 位运算法
- 原理。通过异或(^)位运算得到不同位,在使用位循环进行计算。
- 思路。
- 第一步取得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;
};
方案比较
- 方案一使用的是数组计数法,但是由于有数组补齐操作,显得繁琐,且多了一次循环
- 方案二使用的是位运算法,通过异或(^)位运算得到不同位,在使用位循环进行计算,且只有一次循环,所以效率稍高。
三、总结
- 此题可以数组计数法和位运算法两种方案
- 出入栈法主要是主要是通过toString(2)转化为2进制字符串,再通过数组补齐'0'的方式,实现长度一致可以进行计数。
- 遍历排序法通过异或(^)位运算得到不同位,在使用位循环进行计算。
文中如有错误,欢迎在评论区指正