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") 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *