Ich habe diese Leetcode-Herausforderung zu Hamming Distance gelöst. Würde mich über Feedback zu meiner Syntax und meinem Codestil freuen. Hier ist die Herausforderungsbeschreibung:
Der Hamming-Abstand zwischen zwei ganzen Zahlen ist die Anzahl der Positionen, an denen sich die entsprechenden Bits unterscheiden.
Berechnen Sie bei zwei ganzen Zahlen x und y den Hamming-Abstand.
Hinweis: 0 ≤ x, y < 2 31 .
Beispiel:
Eingabe: x = 1, y = 4
Ausgabe: 2
Erläuterung:
1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
Die obigen Pfeile zeigen auf Positionen, an denen die entsprechenden Bits unterschiedlich sind.
Hier “ s meine Lösung:
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
Antwort
Das ist ein vernünftiger Ansatz, aber Das frühzeitige Konvertieren in Zeichenfolgen und das anschließende Ausführen aller Zeichenfolgen führt zu viel zusätzlichem Code. Beachten Sie, dass dieses Konstrukt in Ihrem Code, if x!=y
, im Wesentlichen zwei Bits XORs ausführt und dann etwas tut, wenn das Ergebnis vorliegt von diesem XOR ist 1.
Wenn Sie dieses XOR direkt auf den ganzen Zahlen ausführen, entsteht das Problem si mpler, das ganze Problem, mit Nullen auffüllen zu müssen, verschwindet (was die Codegröße bereits halbiert), und das Problem wird reduziert, um „die Einsen in Binärform zu zählen“. Das könnte immer noch mit einer ähnlichen Schleife gemacht werden, aber es gibt eine Abkürzung:
return bin(x ^ y).count("1")