1. 程式人生 > >leetcode461 漢明距離( Hamming Distance)

leetcode461 漢明距離( Hamming Distance)

題目描述:

兩個整數之間的漢明距離指的是這兩個數字對應二進位制位不同的位置的數目。(漢明距離是使用在資料傳輸差錯控制編碼裡面的,漢明距離是一個概念,它表示兩個(相同長度)字對應位不同的數量,我們以d(x,y)表示兩個字x,y之間的漢明距離。對兩個字串進行異或運算,並統計結果為1的個數,那麼這個數就是漢明距離。------百度百科解釋)

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

示例:

輸入: x = 1, y = 4

輸出: 2

解釋:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑

上面的箭頭指出了對應二進位制位不同的位置。

解題思路:

首先想到的是把兩個數轉成二進位制,再去比較二進位制的每一位,然後再做二進位制轉換時想到了 “ >> ” 位移運算,一個int型的數包含32個位元組,不斷迴圈的將最高位移到最後一位,然後取出最後一位進行比較,再統計結果。(對位運算這塊不怎麼熟練)

>>   介紹

示例:

整數i=4的二進位制表示為 : 0000 0000 0000 0000 0000 0000 0000 0100
使用位移 >>  運算子 : i >> 2 ,表示向右移兩位,高位補0,結果為
                       0000 0000 0000 0000 0000 0000 0000 0001


i >> 2&1 表示向右移位兩位後取最後一位,這裡的結果為 1 

程式碼實現(java):

class Solution {
    public int hammingDistance(int x, int y) {
       
        int tempx=0;
        int tempy=0;
        int dis=0;
        for(int i=31;i>=0;i--){
            //X>>i&1 表示取出位移運算後的最後一位
            tempx=x>>i&1;
            tempy=y>>i&1;
            
            if(tempx!=tempy)
                dis++;
        }
        
        return dis;
    }
}

補充:

後來再討論區看到別人的解釋後,發現了一種更為簡便的方法,使用Java中異或 “ ^ ” 運算,以及  Integer.bitCount( ) 函式。

異或 “ ^ ” 運算:

異或的運算方法是一個二進位制運算,其運算規則是:在兩個二進位制運算元的相同位中,相同則結果為0,不同則結果為1。   1^1=0   0^0=0   1^0=1   0^1=1

示例:

0000 0000 0000 0000 0000 0000 0101 0100
0000 0000 0000 0000 0000 0000 0100 0001

對這兩個數的異或運算結果為
0000 0000 0000 0000 0000 0000 0000 0101


Integer.bitCount( )函式的用法時統計一個二進位制的數中1位的個數

新的解題思路:

首先對兩個數進行異或運算,這樣直接就比較了兩個數的二進位制數值,相同的為零,不同的為1,然後將用 Integer.bitCount( )統計結果中1的個數,返回值就是漢明距離。

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

這個方法比我的要簡單太多,速度也要快很多。若文章中有錯誤或者更好的方法,歡迎再評論中指出,共同進步。