Eu estava resolvendo este desafio Leetcode sobre Distância de Hamming . Adoraria feedback sobre minha sintaxe e estilo de código. Esta é a descrição do desafio:
A distância de Hamming entre dois inteiros é o número de posições nas quais os bits correspondentes são diferentes.
Dados dois inteiros xey, calcule a distância de Hamming.
Nota: 0 ≤ x, y < 2 31 .
Exemplo:
Entrada: x = 1, y = 4
Saída: 2
Explicação:
1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑
As setas acima apontam para posições onde os bits correspondentes são
diferentes.
Aqui ” é minha solução:
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
Resposta
Essa é uma abordagem razoável, mas converter em strings antecipadamente e, em seguida, fazer tudo com strings leva a muito código extra. Observe que esta construção em seu código, if x!=y
, essencialmente XORs dois bits e então faz algo se o resultado desse XOR é 1.
Fazer aquele XOR diretamente nos inteiros torna o problema si mpler, todo o problema de ter que preencher com zeros desaparece (o que já reduz pela metade o tamanho do código), e o problema é reduzido para “contar os uns em binário”. Isso ainda poderia ser feito com um loop semelhante, mas há um atalho:
return bin(x ^ y).count("1")