LeetCode.461 汉明距离

180 阅读2分钟

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

题目描述:

461. 汉明距离 - 力扣(LeetCode) (leetcode-cn.com)

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

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

示例一

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

示例二

输入: x = 3, y = 1
输出: 1

提示:

  • 0 <= x, y <= 2^31 - 1

思路分析

异或

根据题意,汉明距离指的是两个整数之间对应位置上数字不同的位数。

好像有点抽象,这里我们借用一张官解的图就一目了然了。

image.png

可以看到官方已经帮我们把异或都求好了,根据异或的规律,我们知道相同为0,不同为1,所以我们异或之后只需要求得结果中1的位数即可。

这里我们可以直接使用语言内置的函数即可。

当然,你有能力也可以自己造个轮子,自己实现一遍求1个数的函数。

AC代码

class Solution {
    fun hammingDistance(x: Int, y: Int): Int {
        return Integer.bitCount(x xor y)
    }
}

总结

代码是非常的简单,只有一行代码,但是主要还是里面的思想,这算是取巧的一个办法了,如果想深入一点,也可以自己实现计数的函数,比如官解中的 移位实现位计数,感兴趣的可以自己去参考参考。

同时还有更高大上的 Brian Kernighan 算法

算法永无止境。

参考

汉明距离 - 汉明距离 - 力扣(LeetCode) (leetcode-cn.com)

jdk自带的方法 - 汉明距离 - 力扣(LeetCode) (leetcode-cn.com)