今天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上有詳細...