Jag löste denna Leetcode-utmaning om Hamming Distance . Skulle älska feedback om min syntax och kodstil. Här är utmaningsbeskrivningen:
Hammingavståndet mellan två heltal är antalet positioner där motsvarande bitar är olika.
Ge två heltal x och y, beräkna Hamming-avståndet.
Obs: 0 ≤ x, y < 2 31 .
Exempel:
Ingång: x = 1, y = 4
Utgång: 2
Förklaring:
1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
Pilarna ovan pekar på positioner där motsvarande bitar är olika.
Här ” s min lösning:
def hammingDistance(x: "int", y: "int") -> "int": bin_x = bin(x)[2:] bin_y = bin(y)[2:] len_x = len(bin_x) len_y = len(bin_y) if len_x != len_y: if len_x > len_y: zeros = "0" * (len_x - len_y) bin_y = zeros + bin_y else: zeros = "0" * (len_y - len_x) bin_x = zeros + bin_x dist = 0 for x,y in zip(bin_x, bin_y): if x!=y: dist += 1 return dist
Svar
Det är en rimlig metod, men konvertera till strängar tidigt och sedan göra allt på strängar leder till mycket extra kod. Observera att denna konstruktion i din kod, if x!=y
, i huvudsak XORs två bitar och gör sedan något om resultatet av att XOR är 1.
Att göra det XOR direkt på heltal gör problemet si mpler försvinner hela problemet med att behöva lägga till nollor (vilket ungefär halverar kodstorleken redan) och problemet reduceras till ”räkna de i binär”. Det kan fortfarande göras med en liknande slinga, men det finns en genväg:
return bin(x ^ y).count("1")