Řešil jsem tuto výzvu Leetcode týkající se Hammingovy vzdálenosti . Rád bych zpětnou vazbu o mé syntaxi a stylu kódu. Zde je popis výzvy:

Hammingova vzdálenost mezi dvěma celými čísly je počet pozic, na kterých se odpovídající bity liší.

Vzhledem k dvěma celým číslům x a y vypočítejte Hammingovu vzdálenost.

Poznámka: 0 ≤ x, y < 2 31 .

Příklad:

Vstup: x = 1, y = 4

Výstup: 2

Vysvětlení:

1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 

Šipky výše ukazují na pozice, kde jsou odpovídající bity odlišné.

Tady “ moje řešení:

 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 

odpověď

To je rozumný přístup, ale převod na řetězce brzy a následné provedení všeho na řetězcích vede ke spoustě dalšího kódu. Všimněte si, že tento konstrukt ve vašem kódu if x!=y v podstatě XORs dva bity a pak něco udělat, pokud je výsledek toho XOR je 1.

Provedení tohoto XOR přímo na celá čísla způsobí problém si mpler, zmizí celý problém nutnosti pad s nulami (což je asi polovina velikosti kódu) a problém se sníží na „spočítat ty v binárním formátu“. To by se stále dalo udělat s podobnou smyčkou, ale existuje zkratka:

return bin(x ^ y).count("1") 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *