【Java】LeetCode - 位運算 - #461 漢明距離

力扣力扣 https://leetcode-cn.com/problems/hamming-distance/

#461 漢明距離

漢明距離廣泛應用於多個領域。在編碼理論中用於錯誤檢測,在信息論中量化字符串之間的差異。

兩個整數之間的漢明距離是對應位置上數字不同的位數。

兩個整數之間的漢明距離指的是這兩個數字對應二進制位不同的位置的數目。

給出兩個整數 x 和 y,計算它們之間的漢明距離。

方法一:內置位計數功能

大多數編程語言中,都存在各種內置計算等於 1 的位數函數。

class Solution {
    public int hammingDistance(int x, int y) {
        return Integer.bitCount(x ^ y); 
    }
}

方法二:移位

爲了計算等於 1 的位數,可以將每個位移動到最左側或最右側,然後檢查該位是否爲 1

class Solution {
    public int hammingDistance(int x, int y) {
        int z = x ^ y;
        int distance = 0;
        while(z != 0){
            if(z % 2 == 1){
                distance +=1;
            }
            z = z >> 1;
        }
        return distance;
    }
}

方法三:布賴恩·克尼根算法

方法二是逐位移動,逐位比較邊緣位置是否爲 1。尋找一種更快的方法找出等於 1 的位數。

是否可以像人類直觀的計數比特爲 1 的位數,跳過兩個 1 之間的 0。例如:10001000。

上面例子中,遇到最右邊的 1 後,如果可以跳過中間的 0,直接跳到下一個 1,效率會高很多。

這是布賴恩·克尼根位計數算法的基本思想。該算法使用特定比特位和算術運算移除等於 1 的最右比特位。

當我們在 number 和 number-1 上做 AND 位運算時,原數字 number 的最右邊等於 1 的比特會被移除。

基於以上思路,通過 2 次迭代就可以知道 10001000 中 1 的位數,而不需要 8 次。

class Solution {
    public int hammingDistance(int x, int y) {
        int z = x ^ y;
        int distance = 0;
        while(z != 0){
            distance += 1;
            z = z & (z-1);
        }
        return distance;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章