題目
兩個整數之間的 漢明距離 指的是這兩個數字對應二進制位不同的位置的數目。
給定兩個整數 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編程題彙總(持續更新中……)