如果一個數組中的數組成對出現,怎麼快速查找一個數組中唯一出現一次或出現奇數次的數字
- 思路:通過位運算的異或的性質
- 相同兩個數異或爲0
- 與0異或的數結果不變
- 異或滿足乘法交換律
int search(int a[],int len){
int num = 0;
for(int i = 0; i < len; i++){
num ^= a[i];
}
return num;
}
在一個數組中除兩個數字只出現1次外,其它數字都出現了2次, 要求儘快找出這兩個數字(百度面試題)
這道題的難度就大了很多,對於我來說是很難想到如何快速的找出這兩個數,就在這裏記錄一下大神的解題思路
- 按照第一題的解法,要採取異或操作,要把數組分成兩組,分別滿足只有一個數字只出現一次的情況,要怎麼分組呢??
- 先要快速的找出這兩個數的不同之處,數值不同,但是很難入手。先通過將數組數字全部異或的方式,得到的結果是所要找的兩個數字的異或結果res,由於0^1=1,1^1=1,0^0=1,所以可以根據res的二進制數中位數爲1的信息進行判斷這兩個數的不同,進而將數組進行分組。
- 將分組的數組進行遍歷異或獲取數字
int* search2(int a[],int len){
int res[2] = {0,0};
int t;
for( int i = 0; i < len; i ++){
t ^= a[i];
}
int j;
for(j = 0; j < sizeof(t); j ++){
if( ((t>>j) & 1) == 1 )
break;
}
for(int i = 0; i < len; i ++ ){
if( (a[i] >> j) & 1 ) res[0] ^= a[i];
else res[1] ^= a[i];
}
return res;
}
總結
- 本篇是通過位運算進行解題的另一種思路,需要慢慢領會
最後
- 位運算的用法真的很奇妙,不過就先告一段落,等有時間再好好研習一下
參考鏈接
http://blog.csdn.net/morewindows/article/details/8214003