【leetcode】461. Hamming Distance
最近的学习有些提不起兴趣,我打算加点辅料,开始在leetcode上面刷刷算法题
打算从最简单的最常见的题开始刷,每天1-2题,可以利用一下上下班路途上的时间,岂不是很高效~~
————————————————————————————————————
原题:
The Hamming distance between two integers is the number of positions at which the corresponding bits are different.
Given two integers x and y, calculate the Hamming distance.
解析:
汉明距离是两个数的二进制数之间不同的位数的个数,如1的二进制是(0001),4的二进制是(0100)
那1和4之间的汉明距离就是2(第2位和第4位不同)
我的解法:
public class HammingDistance {
public static int getHammingDistance(int x, int y) {
int hammingDistance = 0;
//取x,y的异或,得到一个2进制,其中1的个数就是汉明距离
int z = x ^ y;
//用z与z-1做与运算,结果也做相同操作,运算几次就有几个1
while (z != 0) {
hammingDistance++;
z = z & (z - 1);
}
return hammingDistance;
}
}
Discuss最优解:
public class Solution {
public int hammingDistance(int x, int y) {
return Integer.bitCount(x ^ y);
}
}
思路一样,只是不知道这个方法。。
计算二进制位数的解法,看了源码是这样的。。
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
不懂原理,但是比我遍历应该要快一些