【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;
    }

不懂原理,但是比我遍历应该要快一些

posted @ 2017-07-02 09:25  l.shane  阅读(548)  评论(0编辑  收藏  举报