Jeg løste denne Leetcode-utfordringen om Hamming Distance . Vil gjerne ha tilbakemeldinger på syntaksen og kodestilen min. Her er utfordringsbeskrivelsen:
Hamming-avstanden mellom to heltall er antall posisjoner der de tilsvarende bitene er forskjellige.
Gitt to heltall x og y, beregne Hamming-avstanden.
Merk: 0 ≤ x, y < 2 31 .
Eksempel:
Inngang: x = 1, y = 4
Utgang: 2
Forklaring:
1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
Pilene ovenfor peker på posisjoner der de tilsvarende bitene er forskjellige.
Her » er løsningen min:
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 er en rimelig tilnærming, men konvertering til strenger tidlig og deretter gjør alt på strenger fører til mye ekstra kode. Vær oppmerksom på at denne konstruksjonen i koden din, if x!=y
, egentlig XORs to bits og gjør deretter noe hvis resultatet av at XOR er 1.
Å gjøre det XOR direkte på heltallene gjør problemet si mpler forsvinner hele problemet med å måtte blokkere med nuller (som omtrent halverer kodestørrelsen allerede), og problemet blir redusert til å «telle de i binær». Det kan fortsatt gjøres med en lignende løkke, men det er en snarvei:
return bin(x ^ y).count("1")