【LeetCode】第461题——汉明距离(难度:简单)
题目描述
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 231.
- 示例:
输入: x = 1, y = 4
输出: 2
解释:
上面的箭头指出了对应二进制位不同的位置。1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/hamming-distance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
思路一:数字整体异或,逐次移位查找1的个数。
思路二:数字整体异或,用自带方法查找1的个数。
思路三:数字整体异或,使用布赖恩·克尼根算法查找1的个数,比思路一移位次数少。
因为我们只在乎数字整体异或后1的个数,因此如果有种方法能一下跳过两个1中间的所有0那便是极好的思路。布赖恩·克尼根算法就是这样一种算法,就是如果提供一个数字n,n与上 n-1 就能把从低位开始直到遇到第一个1的所有位均变为0,直到将这个数字变为0。
如10001000 & 10000111 = 10000000;10000000 & 01111111 = 00000000。分两步将10001000变成了00000000,说明该数字有两个1,也就是有两位不一样。
代码详解
思路一:整体异或,逐位查找1的个数
class Solution {
public int hammingDistance(int x, int y) {
int count = 0; // 记录1的个数
int xor = x ^ y; // 整体异或
while(xor != 0) { // 直到xor为0终止循环
if((xor & 1) == 1) { // 逐位遍历,遍历到1后count就+1
++count;
}
xor = xor >> 1; // 逐位移动
}
return count;
}
}
思路二:整体异或,利用自带方法数出1的个数
class Solution {
public int hammingDistance(int x, int y) {
// 利用Integer的bitCount方法,数出整体异或后1的个数
return Integer.bitCount(x ^ y);
}
}
思路三:利用布赖恩·克尼根算法查找1的个数
class Solution {
public int hammingDistance(int x, int y) {
int count = 0; // 记录1的个数
int xor = x ^ y; // 数字整体异或
while(xor != 0) { // 直到xor为0终止循环
xor = xor & (xor - 1); // 这样异或可以把从最低位到第一个1的所有位均变为0,也就是一下跳过多个0,而不是思路一那样一个个地跳过0
++count;
}
return count;
}
}
注意点
- 既然找不同就说明得利用异或的机制,是一道简单的题,但是布赖恩·克尼根算法是着实被惊艳到了,膜拜大佬。