LeetCode刷题记录(第二天)

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.

翻译后:

两个整数之间的海明距离是相应位不同的位置数。给定两个整数xy计算海明距离。

自己理解:

        原谅我并没有听说过什么是海明距离,于是问了度娘。。。。解释如下:两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。在一个有效编码集中,任意两个码字的海明距离的最小值称为该编码集的海明距离。举例如下: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了,自己真的是太嫩了)。


    虽然现在刷题还很难,但是坚持一定会进步,明天继续更新。

点赞