Estaba resolviendo este desafío de Leetcode sobre Hamming Distance . Me encantaría recibir comentarios sobre mi sintaxis y estilo de código. Aquí está la descripción del desafío:
La distancia de Hamming entre dos enteros es el número de posiciones en las que los bits correspondientes son diferentes.
Dados dos números enteros xey, calcula la distancia de Hamming.
Nota: 0 ≤ x, y < 2 31 .
Ejemplo:
Entrada: x = 1, y = 4
Salida: 2
Explicación:
1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
Las flechas anteriores apuntan a posiciones donde los bits correspondientes son
diferentes.
Aquí » s mi solución:
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
Respuesta
Ese es un enfoque razonable, pero convertir a cadenas temprano y luego hacer todo en cadenas conduce a una gran cantidad de código adicional. Tenga en cuenta que esta construcción en su código, if x!=y
, esencialmente XORs dos bits y luego hace algo si el resultado de ese XOR es 1.
Hacer ese XOR directamente en los enteros hace que el problema sea mpler, todo el problema de tener que rellenar con ceros desaparece (lo que ya reduce a la mitad el tamaño del código), y el problema se reduce a «contar los unos en binario». Eso aún podría hacerse con un bucle similar, pero hay un atajo:
return bin(x ^ y).count("1")