找出2n 1個數中不成對的那個

2022-02-19 03:59:47 字數 1150 閱讀 6764

問題定義:有2n+1個數,只有乙個單著,別的都是成對的,找出這個單著的數。比如:2 1 3 2 1。3是答案。

思路一:暴力搜尋——每個數都和其他數比較,找不到相同的,就得到了結果。時間複雜度為o(n2)

思路二:排序搜尋——先給序列排個序,之後從前往後一對一對的找,直到不是成對的為止。時間複雜度,怎麼也得o(nlgn)

思路三:異或計算,一趟搞定。時間複雜度o(n)

直接看思路三:

原理:異或操作(^)——(對於操作)相同為0,相異為1.比如:1^0 = 1, 1 ^1=0

這樣:例如:5 ^ 5 = 0

對於本題:2 1 3 2 1,都異或一下:相同的(2^2,1^1) 為0,剩下的3和0異或為自身3。(注:異或具有交換律)

#include int

main()

;

int aim = a[0

];

for(i = 1; i < 5; i++)

printf(

"result:

", aim);

return0;

}

異或在這方面挺好,再來個應用:

不用第三個數直接交換兩個數:

#include void swap(int *a, int *b)

intmain()

當然完成這個題目還可以用同樣的思維:

#include void swap(int *a, int *b)

intmain()

找出2n 1個數中不成對的那個

用o n 複雜度搞定。異或操作 對於位操作 相同為0,相異為1.比如 1 0 1,1 1 0 這樣 對於2,1,3,2,1,2 2 1 1 3 3.如此就能將不成對的3找出來。異或具有交換律,所以可以按順序計算,2 1 3 2 1 3。如下 include include include int a...

找出2n 1個數中不成對的那個 公升級版

上篇談到了用異或來解決,確實是個好方法,時間複雜度為o n 比例一遍ok,空間複雜度為o 1 只占用乙個空間足矣。現在把這個問題公升級下 1 給出n個數,其中有且僅有乙個出現了奇數次,其餘的都出現了偶數次。用線性時間常數空間找出這個出現奇數次的數 2 給定n個數,其中有且僅有兩個出現了奇數次,其餘的...

找出2N 1個兩兩配對數中落單那個

對於這個問題,最暴力的求解方法是採用遍歷的操作,然後全部進行,以下方法使用了乙個輔助類,其原理是乙個智慧型容器,當插入元素的時候判斷集合中是否已經有了該元素,沒有就新增,有的話就刪除,如下 usr bin python def findsingle ls con container for i in...