題目
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
思路
我們直到異或的性質:
任何乙個數字異或他自己都等於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的位數,必然這...