Rozwiązałem to wyzwanie Leetcode dotyczące odległości Hamminga . Chciałbym poznać opinie na temat mojej składni i stylu kodu. Oto opis wyzwania:
Odległość Hamminga między dwiema liczbami całkowitymi to liczba pozycji, w których odpowiadające im bity są różne.
Biorąc pod uwagę dwie liczby całkowite xiy, oblicz odległość Hamminga.
Uwaga: 0 ≤ x, y < 2 31 .
Przykład:
Wejście: x = 1, y = 4
Wynik: 2
Wyjaśnienie:
1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
Powyższe strzałki wskazują pozycje, w których odpowiadające im bity są
różne.
Tutaj ” s moje rozwiązanie:
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
Odpowiedź
To rozsądne podejście, ale wczesna konwersja na ciągi, a następnie robienie wszystkiego na łańcuchach prowadzi do dużej ilości dodatkowego kodu. Zwróć uwagę, że ta konstrukcja w Twoim kodzie, if x!=y
, zasadniczo XOR dokonuje dwóch bitów, a następnie robi coś tego XOR wynosi 1.
Wykonanie tego XOR bezpośrednio na liczbach całkowitych stwarza problem si mpler, cały problem wypełniania zerami znika (co już o połowę zmniejsza rozmiar kodu), a problem sprowadza się do „policzenia binarnego”. Nadal można by to zrobić za pomocą podobnej pętli, ale istnieje skrót:
return bin(x ^ y).count("1")