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