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

2021-09-23 23:33:43 字數 1677 閱讀 2126

題目

乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。

思路

我們直到異或的性質:

任何乙個數字異或他自己都等於0.
所以說我們如果從頭到尾依次異或每乙個數字,那麼最終的結果剛好只出現一次的數字,因為成對出現的兩次的數字全部在異或中抵消了。

這道題中有兩個數字只出現一次。這樣的話我們得到的結果就是這兩個數字的異或結果。因此我們想辦法把原陣列分成兩個子陣列,使得每個子陣列包含乙個只出現一次的數字。這樣我們就可以對這兩個子陣列分別異或,就能得到兩個只出現一次的數字。

現在問題是怎樣把原陣列分成兩個子陣列,使得每個子陣列包含乙個只出現一次的數字?

由於異或的結果肯定是那兩個只出現一次的數字的異或結果,所以異或結果肯定不為0,也就是說這個結果二進位制表示中至少有一位是1。我們可以找到第乙個為1的下標位置(記為第n位)作為劃分陣列的依據。第乙個子陣列中每個數的第n位為1,第二個子陣列的每個數的第n位為0。對於出現兩次的數肯定分在同乙個子陣列中。那兩個只出現一次的數字分別分在不同的子陣列中。

假設陣列為{2,4,3,6,3,2,5,5},異或結果為2,二進位制表示為0010。異或得到的結果中倒數第二位為1,於是我們根據倒數第二位是不是為1分為兩個子陣列。第乙個子陣列{2,3,6,3,2},其中所有數字的倒數第二位為1;第二個子陣列{4,5,5},其中所有數字的倒數第二位為0。接下來只要分別對這兩個子陣列求異或,就能找出第乙個子陣列中只出現一次的數字為6,第二個子陣列中只出現一次的數字為4。

**

/*---------------------------------------

* 日期:2015-04-26

* 題目: 40.陣列中只出現一次的數字

* **:

* 結果:ac

* 部落格:

-----------------------------------------*/

#include

#include

using

namespace

std;

class solution //if

int result = data[0];

// 所有數xor

for(int i = 1;i < size;++i)//for

// 二進位制中第乙個為1的下標

int index = 0;

while((result != 0) && ((result & 1) == 0))//while

result = (1

<< index);

*num1 = 0;

*num2 = 0;

for(int i = 0;i < size;++i)//

else//else

}//for

}};int main();

int* num1 = new

int(0);

int* num2 = new

int(0);

solution s;

cout

<<*num1<<" "

<<*num20;}

劍指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的位數,必然這...