給定一個(gè)整型數(shù)組arr,其中有兩個(gè)數(shù)出現(xiàn)了奇數(shù)次,其他的數(shù)都出現(xiàn)了偶數(shù)次,找到這兩個(gè)數(shù)。要求時(shí)間復(fù)雜度為O(N),額外空間復(fù)雜度為O(1)。
給定一個(gè)整形數(shù)組arr及它的大小n,請返回一個(gè)數(shù)組,其中兩個(gè)元素為兩個(gè)出現(xiàn)了奇數(shù)次的元素,請將他們按從小到大排列。
測試樣例:
[1,2,4,4,2,1,3,5],8
返回:[3,5]
class OddAppearance {
public:
vector<int> findOdds(vector<int> arr, int n) {
// write code here
int diff = arr[0];
for(int i=1; i<n; ++i){
diff ^= arr[i];
}
int tmp = diff, num = 0;
while(tmp != 0){
if(1 == (tmp & 1)) break;
tmp >>= 1;
++num;
}
int a = 0;
for(int i=0; i<n; ++i){
if(((arr[i]>>num) & 1) == 1){
a ^= arr[i];
}
}
int b = a^diff;
vector<int> res(2, 0);
if(a<b){
res[0] = a;
res[1] = b;
}else{
res[0] = b;
res[1] = a;
}
return res;
}
};