《劍指offer》 40 陣列中只出現一次的數字

2022-03-17 09:50:05 字數 1240 閱讀 7327

題目:乙個整型陣列裡除了兩個數字外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度為o(n),空間複雜度為o(1)。

例如輸入陣列,因為只有4和6在這個陣列裡出現了一次,所以最後輸出的是4,6。

分析:因為題目要求的時間複雜度和空間複雜度分別為:o(n)和o(1)。所以這個題目不能借助輔助空間,那麼也就是要在一次遍歷後就能找出只出現一次的資料還是有一定的難度的。我在第一次看這個題目的時候也沒想到什麼好的辦法。最後看了書上的提示才想到這個解決方案。

首先我們考慮只有乙個數字出現的情況,這時候我們該怎麼做呢?也就是其他的數字都是成對的出現,而唯獨只有乙個數字是單獨出現。注意這句話非常重要。成對出現的數字有什麼特點嗎?這裡有點難想到,就是這個切入點很難想到,那就是異或運算。相同的數字經過異或運算後,就變為了0。然後如果乙個數字和0異或運算就是它本身。說到這兒,應該就明白了吧!我們將陣列裡的每個數字進行異或運算,如果只有乙個數字最後出現過一次,那麼經過異或完以後,最後剩下的那個不為0的數字就是我們要找的那個數字。因為成對出現的都消失了,剩下的就是孤苦無依的那個單的,呵呵!

看完了只有乙個數字出現一次的情況,我們再來看看有兩個數字出現的情況。想想成對的經過異或運算都化為了0.那麼剩下了兩個資料怎麼樣了呢?一定是不為0,那麼我們可以尋找這兩個數字的不同,**不同?異或運算不為0就是不同啊,所以我們將數字同過異或完最後結果的倒數第一位不是0的二進位制位來將陣列分為兩組,這樣的話就把我們需要找的兩個數字分到了兩個陣列裡,並且在這個兩個子陣列裡,除了乙個數字出現一次外,其他的都是成對的出現,這下好了,問題轉化為我們討論的第一種情況,那麼困難也就迎刃而解了!

具體實現**:

#include

using namespace std;

int arr[8]=;

//判斷二進位制位是否是1;

bool isbit1(int num,unsigned int indexbit)

//找到陣列進行異或操作後第乙個是1的二進位制位。

unsigned int findfirstbitis1(int num)

return indexbit;

}//找到出現一次的的數子

void findnumappearonce(int *arr,int length,int *num1,int *num2)

{ if(arr==null || length<2)

return ;

int resultexclusiveor=0;

for(int i=0;i

執行結果:

劍指offer 40 陣列中只出現一次的字元

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次,請寫出程式找出這兩個只出現了一次的數字,要求時間複雜度為o n 空間複雜度為o 1 此時出了迴圈,tty為兩個只出現一次的數的異或值 現在需要確定tty的最低位1在哪個bit位 int index 0 int num1 0 int num2 0...

劍指offer40陣列中只出現一次的數字

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解題思路 將陣列分成兩個陣列,每個陣列中包含乙個只出現一次的數字,其他都為出現兩次的數字。由於這兩個只出現一次的數字不相同,所以可以根據整個陣列異或的結果和1進行與操作,作為分割兩個陣列的位置。分割為兩個陣列...

劍指offer 40陣列中只出現一次的數字

題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了偶數次。請寫程式找出這兩個只出現一次的數字。分析 1.因為有2個數字只出現了一次,而其他的數字都是2次,通過異或運算,最後可以得到這2個只出現一次的數字的異或結果值,這個值必然不為0。2.然後找出這個數字二進位制中,最低位為1的位數,必然這...