1. 程式人生 > >【LeetCode】漢明距離

【LeetCode】漢明距離

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

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

注意:
0x,y<231.

示例:

輸入: x = 1, y = 4

輸出: 2

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

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

Python解法1(直觀複雜)

def hammingDistance(x, y):
    bi_x = bin(x)[2:] # 轉化為二進位制,從第三個字元開始取,因為前兩個字元都是'0b'
    bi_y = bin(y)[2
:] # 將兩者分為較長者與較短者 if x > y: long_bi = bi_x short_bi = bi_y else: short_bi = bi_x long_bi = bi_y # 轉化為list short_bi_list = list(short_bi) long_bi_list = list(long_bi) # 計算長度 len_short = len(short_bi) len_long = len(long_bi) # 計算較小數的位數之間的比較,比較不同的個數求和
count1 = sum([short_bi_list[-i] != long_bi_list[-i] for i in range(1, len_short + 1)]) # 計算對較長數,其餘的部分不同的個數求和(因為較短者這部分都是0,較長者不同的直接考慮1的個數) count2 = sum([int(x) for x in long_bi_list[:(len_long - len_short)]]) return count1 + count2

耗時:56ms

Python解法2(運用了一些表示式)

def hammingDistance
(x, y):
# 將x與y自動轉化成二進位制,然後取亦或(對二進位制而言,相同的變為0,不同的變為1) xor = x ^ y count = 0 for _ in range(32): # 這裡迴圈32次,以為題目條件輸入的數字是小於2^31 count += xor & 1 # &表示將兩個數轉化為2進位制,按較短位數擷取比較,相同取1不同取0,然後得到的數字再轉化為10進位制顯示。 xor = xor >> 1 # >>表示帶符號移位,程式碼表示向右移一位(二進位制移位運算就相當於除以二取整) return count

耗時:48ms

Python解法3(一行程式碼)

def hammingDistance(x, y):
    # ^取了亦或後,轉化為2進位制數,相同為0,不同為1。然後算1的個數,其實就相當於找不同的個數。
    return bin(x ^ y).count('1')

耗時:48ms

心得

這道題如果知道一些二進位制的運算子,就會變得非常簡單,同時速度也會有顯著提升。之前不理解,如今正好通過這道題,可以加深對二進位制運算子的理解。

下面有一些重點以後注意:

  1. bin 可以將10進位制轉化為二進位制。
  2. range(1, 2) 就只有1。
  3. ^ 表示對兩個二進位制數進行亦或。
  4. & 表示對二進位制,從小位到大位,分位置求且運算。
  5. >> 表示帶符號的移位運算,就相當於除以二。
  6. >>> 表示不帶符號的移位運算,左邊補0,右邊移位。
  7. 帶符號的二進位制:負數的二進位制數,最左邊一位是1;正數最左邊一位是0。