唯一出現兩次的數字

2021-06-21 07:07:53 字數 1379 閱讀 6379

今天mayuyu遇到了一道很難的數學題,人家本來就不擅長數學嘛!!!在網友的幫助下,mayuyu順利解決了它。

mayuyu的問題是這樣的:

給定乙個長度為100000的整數陣列,沒有排過序,所有整數的範圍均在int內,除了其中乙個數字出現過2次 以

外,其餘

的數字都出現過3次,現在要mayuyu找出唯一出現過兩次的這個數。要求時間在3000ms

mayuyu的分析:

以前見到過乙個題,描述大致是:給定乙個長度為n的整數陣列,n是區間[1,100000]內的乙個奇數,其中一

個數字只出現過一次,剩下的數字

都出現了兩次,請你找出這個唯一的數字是多少 ?

嗯,上面的問題直接把所有數字都異或起來就行了,最終得到的結果就是這個唯一的數字,因為兩個相同的數字異

或後相當於抵消了,所以最終得到那個唯一的數字,這個事實沒有什麼爭議。

但是今天的問題與以前的是不一樣的,今天的問題看起來沒有什麼好的解決方案啊。

除了乙個數出現了2次,其餘的數字都出現了3次,如果我們把所有的數字加起來對3取餘,那麼我們得到的結果與

出現兩次的這個數字的兩倍對3取餘的結果相等,因為其餘的數字都出現過3次,它們的和必定被3整除。可以看出,

這樣我們只能得到

從上面可以看出,如果我們做到只對出現3次的數取餘,而不對出現過兩次的數取餘,那麼就能順利求出這個數。

我們用另一種方法就可以做到這一點,試想一下,如果我們把所有的數字都寫成三進製的形式,然後對於每乙個數

字相同的三進製位加起來對3取模,得到的將是兩個出現兩次的和的三進製的對應位。注意這裡是兩個數的和,那

麼,原本對應的數字就是這樣計算的

這樣,我們才計算出一位,所以我們把所有的位都計算出來後,再轉化成十進位制就行了。

到了這裡,mayuyu就毫不猶豫地寫出了**:

#include #include #include using namespace std;

const int n = 100005;

int a[n];

int c[n][12];

void invert(int c,int n)

}int work(int a,int n)

int main()

{ int n;

while(cin>>n)

{for(int i=0;i>a[i];

cout<

尋找陣列中唯一出現兩次的數

假設你有乙個用1001個整數組成的陣列,這些整數是任意排列的,但是你知道所有的整數都在1到1000 包括1000 之間。此外,除乙個數字出現兩次外,其他所有數字只出現一次。假設你只能對這個陣列做一次處理,用一種演算法找出重複的那個數字。如果你在運算中使用了輔助的儲存方式,那麼你能找到不用這種方式的演...

陣列中唯一出現1次的數 唯一出現2次的數

題目 乙個整型陣列裡除了1個數字之外,其他的數字都出現了兩次,請寫程式找出這個只出現一次的數字。要求時間複雜度是 o n 空間複雜度是 o 1 例如輸入陣列 2,4,3,3,2,5 因為只有 4 這個數字只出現一次,其他數字都出現了兩次,所以輸出 4 分析 本題以及延伸題目,在劍指offer上有詳細...

演算法題1 陣列中唯一出現1次的數 唯一出現2次的數

題目 乙個整型陣列裡除了1個數字之外,其他的數字都出現了兩次,請寫程式找出這個只出現一次的數字。要求時間複雜度是 o n 空間複雜度是 o 1 例如輸入陣列 2,4,3,3,2,5 因為只有 4 這個數字只出現一次,其他數字都出現了兩次,所以輸出 4 分析 本題以及延伸題目,在劍指offer上有詳細...