您的位置:首页 > 其它

LeetCode刷题记录(第二天)

2018-03-20 23:56 239 查看
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了,自己真的是太嫩了)。
    虽然现在刷题还很难,但是坚持一定会进步,明天继续更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: