找陣列中只出現一次的兩個數 位運算

2021-07-03 14:25:03 字數 927 閱讀 2193

這是昨天人人院招的一道筆試演算法題

題目大概意思是,有乙個無序的從1-n的陣列,每個數都是存了兩遍,但是丟失了兩個數,把這丟失的兩個數找到,例如給定的n=3,a=[1,2,1,3],丟失的兩個數為2,3。

其實就是找陣列中只出現一次的兩個數。

對於這種偶數字中尋找奇一般是通過異或的方法,因為異或滿足結合律和交換律,兩個相同的數異或結果相同,且不需要管順序,如果是求陣列中只出現一次的乙個數,直接用0跟陣列中所有的元素進行異或,最後異或的結果就是那個數。

現在是有兩個數隻出現一次,如果兩個數是同乙個數,例如1-4中a=[1,2,3,2,3,1]丟的兩個全是4,那異或的結果肯定是0,這樣直接用2*1-4的和減去陣列的和,再除以2就是丟失的那個數了。

如果兩個數是不同的數,那肯定異或結果不為0,然後取異或結果裡從左邊開始第乙個為1的位pos,因為現在的異或結果肯定是兩個數異或的結果(出現兩次的都抵消了),這兩個數在pos位上肯定是乙個是0乙個是1,可以將這兩個數分開,然後再遍歷一遍陣列,按之前的方法將陣列分成兩類(真正寫的時候可以直接用兩個數num1,num2,如果pos位為1,則與num1異或,pos位為0則與nums2異或,最後結果就是num1,num2,可以不用再存在陣列裡),再用處理乙個不同數的方法就可以處理了。

class solution 

if (xor == 0)//兩個丟失的數相同則計算和的差

else//丟失的兩個數不同

int newcount = pow(2, count);

int num1 = 0, num2 = 0;

for (int i = 0; i < nums.size(); i++)

else

}res.push_back(num1);

res.push_back(num2);

} return res;

}};

陣列中只出現一次的兩個數

劍指 offer 56 i.陣列中數字出現的次數 大意 找出陣列中只出現一次的兩個數 其它出現兩次 思路 思路 首先需要知道乙個前置問題 找出陣列中只出現一次的乙個數 其它出現兩次 顯然,對整個陣列進行異或操作即可。那麼,我們是否有可能將本題中的陣列分隔成兩部分呢 不要求連續 答案是肯定的 我們仍然...

陣列中只出現一次的兩個數字

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。你可以假設這兩個數字一定存在。樣例輸入 1,2,3,3,4,4 輸出 1,2 解決方案 異或 兩個相同的元素異或 設出現一次的數字分別為x和y 1,先用乙個sum 將整個陣列遍歷一遍同時異或該陣列元素與sum...

陣列中只出現一次的兩個數字

我們知道如果出現一次的數只有1個,其餘的都出現了兩次,那麼,直接異或一遍就可以了,但是,此題有2個 所以,異或一遍的結果為x y,即出現一次的兩個數異或的結果,從s x y 0,知道s的某位為1,x與y的在s為1的位不一樣,這樣就可以將數分為兩個集合,與s相同位為1的和s相同位為0的,x與y一定在兩...