Stavo risolvendo questa sfida Leetcode sulla distanza di Hamming . Mi piacerebbe un feedback sulla mia sintassi e stile di codice. Ecco la descrizione della sfida:
La distanza di Hamming tra due numeri interi è il numero di posizioni in cui i bit corrispondenti sono diversi.
Dati due numeri interi x e y, calcola la distanza di Hamming.
Nota: 0 ≤ x, y < 2 31 .
Esempio:
Input: x = 1, y = 4
Output: 2
Spiegazione:
1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
Le frecce sopra indicano le posizioni in cui i bit corrispondenti sono
diversi.
Qui ” è la mia soluzione:
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
Answer
Questo “è un approccio ragionevole, ma convertire in stringhe in anticipo e poi fare tutto su stringhe porta a molto codice extra. Nota che questo costrutto nel tuo codice, if x!=y
, essenzialmente XORs due bit e poi fa qualcosa se il risultato di quello XOR è 1.
Fare quello XOR direttamente sugli interi rende il problema si mpler, scompare lintero problema di dover riempire con zeri (che già dimezza circa la dimensione del codice), e il problema si riduce a “contare quelli in binario”. Ciò potrebbe ancora essere fatto con un ciclo simile, ma esiste una scorciatoia:
return bin(x ^ y).count("1")