問題定義:有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...