Hamming Distance
原题目:
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.
翻译后:
两个整数之间的海明距离是相应位不同的位置数。给定两个整数x
并y
计算海明距离。
自己理解:
原谅我并没有听说过什么是海明距离,于是问了度娘。。。。解释如下:两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。在一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离。举例如下:10101和00110从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。其实看到这里我还是没有太懂。。。。(是不是太笨不适合做程序员),后来当看到了如何计算时,我终于理解了。
其实说白了,就是把两个数字转换为2进制,然后进行异或运算,结果中有几个1,海明距离就是多少。
异或运算,是一种逻辑运算,也叫半加运算,就是两个2进制数进行加法运算,但是不进位(只能这么解释了,上大学老师就是这么教的。。。)其运算法则为:a⊕b = (¬a ∧ b) ∨ (a ∧¬b),1⊕0=1,0⊕0=0,1⊕1=0。
事例:
输入: x = 1,y = 4 输出: 2 说明: 1(0 0 0 1) 4(0 1 0 0) ↑ ↑ 以上箭头指向相应位不同的位置。
思路:
想明白是求什么了,也知道运算逻辑了:
1、首先要把两个数字转换为2进制;
2、然后做异或运算;
3、求结果中包含几个1.
但是问题又来了:如何直接用java转换一个数为2进制?如何用代码做异或运算?所以还是先学习了一下相关知识,但是最后还是没能自己写出来方法,所以直接上大神们的代码喽:
public int hammingDistance(int x, int y) {
int xor = x^y; //求x与y的异或结果
int res = 0; //记录结果中有几个1
while(xor!=0) {
res+= xor & 1; //异或结果与1进行&运算,这样如果最后一位为1就输出1,为0就输出0,可以判断结果中有几个1
xor >>= 1; //异或结果右移一位,去掉刚才判断过的最后一位,指导移完为0,跳出循环
}
return res;
}
看了大神的代码,才知道原来在java中不用转换2进制,直接异或就可以,而且寻找结果中有几个1也是使用的逻辑运算,真是长知识了。。。。
下面再来一个更牛的吧:
public class Solution {
public int hammingDistance(int x, int y) {
return Integer.bitCount(x ^ y);
}
}
看了这个方法,去学习了一下bitCount()方法:这是Integer自带的方法,直接统计2进制数字中1的个数(看来有时间要多看看api了,自己真的是太嫩了)。
虽然现在刷题还很难,但是坚持一定会进步,明天继续更新。