好好的利用異或能夠產生奇妙的效果。
異或運算的性質:
不論什么一個數字異或它自己都等於0。也就是說。假設我們從頭到尾依次異或數組中的每個數字,那么終於的結果剛好是那個僅僅出現一次的數字。由於那些出現兩次的數字所有在異或中抵消掉了。
例題:
給定大小是N的數組,數組里的元素互相不反復,元素的大小范圍是1~(N+1)。目標是找出第一個miss的數。要求時間復雜度O(N)。空間是O(1).
由於這個數組總共僅僅有N 個元素,因此在1--N+1中必然有一個數不存在。設res =0, 使用異或操作,先讓res和 下標+1 異或,然后同每個數異或。當中出現兩次的數剛好異或為0.剩下的則是結果。
<span style="font-size:14px;">// you can also use includes, for example: // #include <algorithm> int solution(vector<int> &A) { // write your code in C++98 int res = 0; int max = A.size(); if(max==0) { return 1; } for(int i=0;i<A.size();i++) { res^=(i+1); if(A[i]<=max) { res^=A[i]; } } return res==0?max+1:res; }</span>
類似的另外一道題:
題目:一個整型數組里除了兩個數字之外。其它的數字都出現了兩次。請敲代碼找出這兩個僅僅出現一次的數字。要求時間復雜度是O(n),空間復雜度是O(1)。
答案見: http://zhedahht.blog.163.com/blog/static/2541117420071128950682/
參考文獻:
http://www.cnblogs.com/parapax/p/3632255.html