1. 程式人生 > >C++ 中的異或操作^

C++ 中的異或操作^

you 整型 lin 不存在 要求 -s cal tar rda

好好的利用異或能夠產生奇妙的效果。

異或運算的性質:

不論什麽一個數字異或它自己都等於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

http://blog.csdn.net/caopengcs/article/category/1502799/4

C++ 中的異或操作^