1. 程式人生 > >1000個無序數查詢兩個重複數

1000個無序數查詢兩個重複數

按位異或運算子: ^

兩個相同的數按位異或結果為0

任何數和零按位異或結果為這個數本身

根據按位異或的以上特性, 我們可以為下面這首題目給出一個簡便的演算法:

有一個長度為10000的數列, 存放著1-10000的自然數, 連續, 不重複, 但數列並不是有序的

現在隨機選取1-10000之間的某個自然數, 加入到這個數列中, 要求用簡便的演算法找到這個後來加入的數

分析一下, 這個問題是肯定不能用序列中數之和減去1-1000數列和的辦法的, 這樣做可能會造成溢位, 首先排除.

第二, 有的人認為這個題目說的是有序陣列, 我覺得應該不是的. 如果陣列是有序的, 只要比較前後兩個數是否相差1就可以很快速也很容易找到重複數.

而這種問題非常適合異或(如果不是數值型別, 則不適合), 因為上面講的按位異或運算子的兩個特性, 可得1^1=0, 1^1^2=2, 1^2^1^2^3=3…

所以, 陣列中10001個數的"異或和"再與1-1000異或可得重複的那個數.

異或查詢:

int xor = 0;
for (int i = 0; i <= list.Max; i++)
{
    xor ^= list[i];
    xor ^= i;
}