Ratkaisin tämän Leetcode-haasteen Hamming-etäisyydestä . Haluaisin palautetta syntaksistani ja koodityylistäni. Tässä haasteen kuvaus:
Kahden kokonaisluvun välinen Hamming-etäisyys on niiden paikkojen lukumäärä, joissa vastaavat bitit ovat erilaiset.
Annetaan kaksi kokonaislukua x ja y laskemalla Hammingin etäisyys.
Huomaa: 0 ≤ x, y < 2 31 .
Esimerkki:
Syöttö: x = 1, y = 4
Tulos: 2
Selitys:
1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
Yllä olevat nuolet osoittavat paikkoihin, joissa vastaavat bitit ovat
erilaisia.
Täällä ” ratkaisuni:
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
vastaus
Tämä on järkevä lähestymistapa, mutta muuntaminen merkkijonoiksi aikaisin ja sitten kaiken tekeminen merkkijonoista johtaa paljon ylimääräiseen koodiin. Huomaa, että tämä koodissasi oleva rakenne, div div = = 85fce1b504 ”>
, olennaisesti XORs kaksi bittiä ja tekee sitten jotain, jos tulos että XOR on 1.
XOR: n tekeminen suoraan kokonaislukuihin tekee ongelmasta si mpler, koko nollatyyppien aiheuttama ongelma katoaa (mikä puolittaa jo koodikoon), ja ongelma pienennetään ”laskemaan binäärit”. Se voidaan silti tehdä samanlaisella silmukalla, mutta siinä on pikakuvake:
return bin(x ^ y).count("1")