1. 题目描述

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

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

注意:0 ≤ x, y < 231.

示例:

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

2. 解题思路

最直接的思路就是将两个数都转化为二进制数,这里使用的是toString()方法,该方法有一个可选的参数,表示转为的字符串的进制数。

转化成的二进制数如果位数不相等,在前面要用0补齐。最后比较对应的每一位即可。

该方法的时间复杂度为O(n),空间复杂度为O(n)。

还有一种的方法就是使用异或操作,两个数的异或就是不同的位数,使用正则表达式进行匹配即可。

该方法的时间复杂度为O(1),空间复杂度为O(1)。

2. 代码实现

  1. /**
  2. * @param {number} x
  3. * @param {number} y
  4. * @return {number}
  5. */
  6. var hammingDistance = function(x, y) {
  7. let xStr = Number(x).toString(2)
  8. let yStr = Number(y).toString(2)
  9. const xLen = xStr.length
  10. const yLen = yStr.length
  11. let res = 0
  12. // 将两者的位数补齐
  13. if(xLen > yLen){
  14. yStr = Array(xLen - yLen + 1).join('0') + yStr
  15. }else if(yLen > xLen){
  16. xStr = Array(yLen - xLen + 1).join('0') + xStr
  17. }
  18. for(let i = 0; i < xStr.length; i++){
  19. if(xStr[i] !== yStr[i]){
  20. res += 1
  21. }
  22. }
  23. return res
  24. };

异或:

  1. /**
  2. * @param {number} x
  3. * @param {number} y
  4. * @return {number}
  5. */
  6. var hammingDistance = function(x, y) {
  7. return ((x ^ y).toString(2).match(/[1]/g) || []).length
  8. };

4. 提交结果

461. 汉明距离 - 图1
异或:
461. 汉明距离 - 图2