Ik was deze Leetcode-uitdaging over Hamming Distance aan het oplossen. Zou graag feedback krijgen over mijn syntaxis en codestijl. Hier is de uitdagingbeschrijving:
De Hamming-afstand tussen twee gehele getallen is het aantal posities waarop de corresponderende bits verschillend zijn.
Gegeven twee gehele getallen x en y, bereken de Hamming-afstand.
Opmerking: 0 ≤ x, y < 2 31 .
Voorbeeld:
Invoer: x = 1, y = 4
Uitvoer: 2
Uitleg:
1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
De bovenstaande pijlen wijzen naar posities waar de corresponderende bits
verschillend zijn.
Hier ” s mijn oplossing:
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
Antwoord
Dat is een redelijke benadering, maar vroeg converteren naar strings en dan alles aan strings doen, leidt tot veel extra code. Merk op dat deze constructie in uw code, if x!=y
, in wezen twee bits XOR maakt en dan iets doet als het resultaat van die XOR is 1.
Door die XOR rechtstreeks op de gehele getallen te doen, wordt het probleem si mpler, het hele probleem van het moeten vullen met nullen verdwijnt (wat de codegrootte al ongeveer halveert), en het probleem wordt gereduceerd tot “tellen die in binair zijn”. Dat zou nog steeds kunnen worden gedaan met een vergelijkbare lus, maar er is een sneltoets:
return bin(x ^ y).count("1")