给定一个整型数组arr,其中有两个数出现了奇数次,其他的数都出现了偶数次,找到这两个数。要求时间复杂度为O(N),额外空间复杂度为O(1)。
给定一个整形数组arr及它的大小n,请返回一个数组,其中两个元素为两个出现了奇数次的元素,请将他们按从小到大排列。
测试样例:
[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;
}
};
网友评论