タイトル説明
二つの数の整数型配列に加えて、他の数字が二回表示されます。これら二つの図が表示されるだけで検索するプログラムを作成してください。
思考
私は、解決する辞書を取得するために暴力を使用するつもりだった質問は、その後、それぞれの数をカウントします。
最適化
スペースの複雑さはO(1)であります
XORと、XOR同数のXOR 0,0、任意の数の任意の数です。
だから、2つの番号のすべてまたは異なる結果の数が一度だけ表示されること
次いで、XOR結果に応じて、ビットの数は、2つの異なるものを同定するために(ちょうどのような見つける必要があります)
このビットパケットによれば、グループは、グループとして、0、1です。このように、2つの図は、異なるグループに割り当てられている必要があります。数字の各セットの内側には、わずか数は一度だけ表示され、残りの数は言うまでもない.....二回登場し、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