找出陣列中2個只出現一次的數字

2021-06-11 05:01:27 字數 846 閱讀 7492

題目:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。

請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。

分析一下:這個問題有點特殊,而且不能按常規解法來求解,因為時間和空間達不到要求,常規解法比如:先排序,後找,重複的元素是挨在一起的,這樣時間複雜度為o(nlogn),但是還有棧空間,或者利用桶排序,時間複雜度為o(n),但空間複雜度為o(n);要麼利用位排序等等,還有類似於位排序的解法:利用乙個額外的陣列記錄每個數字是否出現等等,可是都達不到題目時間空間雙重要求啊!

這裡有乙個解法:還是利用位異或(覺得異或真是很強悍啊,很多題目利用這個解決很好):由於陣列中只有2個數字(設為a、b)出現一次,其餘的都出現兩次,那麼把所有元素異或,就得到xor = a^b;我們利用這個結果,由於xor中每乙個為1的二進位制位是不是都屬於a或b之一的,並且a、

b只有乙個該位為1,這樣我們可以根據xor為1的位把原陣列的元素分為兩部分:一部分某位為1,一部分該位不為1,這樣再把這兩部分分別異或,就得到這兩個數了,為了節約時間,就已xor最低為1的位作為分隔:

#include using namespace std;

void main()

; int xor = 0;

int i,index = 0;

int len = sizeof(array)/(sizeof(*array));

//先把所有元素異或

for(i=0;i>= 1;

} for (i=0;i>index) & 1))//按照該位是否為1來分類

else

num2 ^= array[i];

} cout<<"該陣列唯一2個不重複元素為:"<

找出陣列中只出現一次的數字

乙個整型陣列裡除了乙個數字以外,其他數字都出現了兩次。找出這個只出現一次的數字 異或運算 任何乙個數字異或它本身都等於0,如果從頭到尾異或陣列中的每乙個數字,那些出現兩次的數字全部在異或中會被抵消,最終的結果剛好是這個只出現一次的數字 package jbarray 找出陣列中只出現一次的數字 au...

找出陣列中只出現一次的數字

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。package factory description 只出現一次的數字 author jaryn date 2019 12 2 16 36 public class onenumer return...

40 找出陣列中只出現一次的數字

題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。編寫程式找出這個兩個只出現一次的數字。要求時間複雜度o n 空間複雜度o 1 如,輸出 解析 空間複雜度為o 1 斷絕了用hash table的思路,時間複雜度o n 斷絕排序的思路。如何判斷乙個數字出現2次呢?異或的性質 任何數字和...