JavaScript的知識整理(7)
技術標籤:LeetCodepython演算法LeetCode漢明距離
兩個整數之間的漢明距離指的是這兩個數字對應二進位制位不同的位置的數目。給出兩個整數x
和y
,計算它們之間的漢明距離。
注意:
0 ≤x
,y
< 231.
示例:
輸入: x = 1, y = 4 輸出: 2 解釋: 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 上面的箭頭指出了對應二進位制位不同的位置。
第一版程式碼: 就是直接求整數的二進位制表示式, 又因為前兩位是"0b", 從第三位開始擷取有用的資訊.又因為如果兩個數差別的比較大可能顯示的位數不同, 而進行了補充, 其實這是多餘的, 並沒有必要這樣做
class Solution: def hammingDistance(self, x: int, y: int) -> int: a = bin(x)[2:] b = bin(y)[2:] bits = len(a) - len(b) if bits == 0: pass elif bits > 0: b = "0" * bits + b elif bits < 0: a = "0" * (-bits) + a res = 0 for i, j in zip(a, b): if i != j: res += 1 return res
雖然是通過了, 但是效果很差需要改善
第二版程式碼: 第一版程式碼就是嚴格按照題意的表達來計算的, 其實有直接求異或的操作就直接求到了結果, 然後的工作就是求這個結果資料的二進位制有多少個1了
class Solution: def hammingDistance(self, x: int, y: int) -> int: xor = x ^ y res = 0 while xor: res += 1 xor = xor & (xor - 1) return res
雖然沒有質的提升, 但是我們需要掌握這種求一個數的二進位制有多少個1 的方法, 為什麼這樣就可以求xor有多少個1 呢?
如果xor不為0, 那麼他的二進位制中肯定有至少一個1 的, 我們讓res += 1 然後就是我們怎麼消去了其中的一個1, 我們這裡消去的就是最後的一個1 .仔細想想我們將xor- 1 就是講最後一個1 變成了0, 然後將這個1 後面的都變成了1, 這樣把這兩個數求與操作就將這個1 化為了0
第三版程式碼: 另外一種求解二進位制中多少個1 的方法
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
xor = x ^ y
res = 0
while xor:
if xor & 1:
res += 1
xor = xor >> 1
return res
和上面的效果幾乎是一樣的, 這裡的原理是: 每次只看最後一位是不是1 , 如果是那就res += 1 然後右移一位, 直到全部為0
第四版程式碼: 其實求到了xor就可以直接轉換成str進行統計了
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
xor = x ^ y
res = bin(xor).count('1')
return res
雖然時間上提升了很多, 而且好多大佬也是這麼做的, 時間最短的大佬也是這麼寫的, 但是我認為使用到了count()這個內建的函式, 並不是很好, 還是自己寫比較好
第五版程式碼
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
xor = x ^ y
xor = bin(xor)
res = 0
for ch in xor[2:]:
if int(ch):
res += 1
return res
和前面的效果相當, 果然沒有內建的效率高, 但是方法大致就這幾種吧!