título Descrição
Além de uma matriz de números inteiros em dois números, os outros números aparecem duas vezes. Por favor, escreva um programa para encontrar estas duas figuras aparecem apenas.
pensamento
A pergunta que eu ia usar a violência para resolver, obter um dicionário, em seguida, conta cada número.
otimização
complexidade de espaço é O (1)
Com XOR, o mesmo número de XOR é XOR 0,0 qualquer número de qualquer número.
Assim que a totalidade ou uma série de resultados diferentes para os dois números aparecem apenas uma vez
Em seguida, de acordo com o resultado XOR, o número de bits para identificar dois um diferente (só precisa encontrar uma like)
De acordo com este bit pacotes, um grupo é 0, 1, como um grupo. Desta forma, as duas figuras deve ter sido atribuído a diferentes grupos. O interior de cada conjunto de números, apenas alguns aparecer apenas uma vez, e o número restante apareceu duas vezes ..... escusado será dizer, foram XOR
class Solution:
def FindNumsAppearOnce(self, array):
if len(array)<2:
return False
num = array[0] ^ array[1]
for i in range(2,len(array)):
num ^= array[i]
# 找到二进制位不同的一位,只需要找出来一位就行
i = 1
while num%2 == 0:
num = int(num//2)
i += 1
# 按照上面找到的二进制位分组异或
num1 = 0
num2 = 0
for num in array:
if num%(2**i) == (2**(i-1)):
num1 ^= num
else:
num2 ^= num
return num1,num2