Python編程題37--漢明距離

題目

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

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

例如:

給定兩個整數:x = 1, y = 4,返回結果:2

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

可以看出 1 和 4 對應二進制位不同的位置的數目有 2 個。

說明:0 ≤ x, y ≤ 2^31 - 1

實現思路1

  • 使用 二進制 的方式來實現
  • 通過 bin() 函數,先把 x 和 y 都轉換爲二進制數(字符串形式,如整數 10 轉換爲二進制後爲 0b1010,開頭的0b表示是二進制)
  • 根據 x 和 y 的範圍說明,可以知道其最大值轉換爲二進制數後是31位,所以可通過 zfill() 函數,繼續把 x, y 處理爲32位的二進制數,不足32位就用 0 補足
  • 用 res 表示兩個數字對應二進制位不同的位置的數目
  • 遍歷轉換後的 x 或 y,對比二進制位不同的位置,如果不相同則加 1

代碼實現1

def hammingDistance(x, y):
    res = 0
    # bin()方法 轉爲二進制數,zfill() 方法返回指定長度的字符串
    tmp_x, tmp_y = bin(x)[2:].zfill(32), bin(y)[2:].zfill(32)
    for i in range(len(tmp_x)):
        if tmp_x[i] != tmp_y[i]:
            res += 1
    return res

實現思路2

  • 使用 異或運算 + 二進制 的方式來實現
  • 先對 x 和 y 進行異或運算,異或運算時,其實也是轉化爲二進制後按位比較(相同位的值爲0,不同爲1)
  • 接着把異或後的結果,通過 bin() 函數轉換爲字符串形式的二進制數
  • 最後通過 count() 函數 統計出轉換後的二進制數中有多少個 1 即可

在二進制的異或運算中,例如a=12,b=7,那麼a異或b的結果c計算如下:

a = 0 0 0 0 1 1 0 0
b = 0 0 0 0 0 1 1 1
c = 0 0 0 0 1 0 1 1 (相同位的值爲0,不同爲1)

代碼實現2

def hammingDistance(x, y):
    return bin(x ^ y).count("1")

實現思路3

  • 不使用內置的二進制函數,僅使用 位運算符 的方式實現
  • 先對 x 和 y 進行異或運算,用 res 表示異或結果,接着需統計 res 對應的二進制數中有多少個 1 ,用 count 來表示,其默認值爲 0
  • while循環,當 res 大於0時,對 res 和 1 進行 & 與運算,其目的是檢查 res 對應二進制中的最低位是否是否爲 1 ,如果爲 1 則令 count 加 1
  • 每次循環,最後都需要把 res 通過 >> 運算符 整體右移一位,這樣一來, res 對應二進制中的最低位就會被捨棄,其次低位在右移後自然就變爲了新的最低位
  • 重複以上過程,直到 res=0 時退出循環,最終得到的 count 就統計出了原 res 對應二進制中 1 的個數

& 按位與運算符:參與運算的兩個二進制數, 如果兩個相應位都爲1, 則該位的結果爲1, 否則爲0;
>> 右移動運算符:如 i >> 1,表示將 i 對應的二進制數整體右移一位,其實也就相當於 i // 2

代碼實現3

def hammingDistance(x, y):
    res, count = x ^ y, 0
    while res:
        count += res & 1
        res >>= 1
    return count

更多Python編程題,等你來挑戰:Python編程題彙總(持續更新中……)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章