给定一个整型数组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) {
//n与0异或结果为n;n与n异或结果为0.
// result = a ^ b
int result = 0;
for (int i = 0; i < n; ++i)
result = result ^ arr[i];
// get the non-zero bit
int k = 0;
while (!((result>>k)&1))
++k;
// get a
int a = 0;
for (int i = 0; i < n; ++i)
if ((arr[i]>>k)&1)
a = a ^ arr[i];//a与arr中第k位为1的整数异或,完成后结果为a或b中的一个
// get b
int b = a ^ result;
vector<int> outcome(2,0);
outcome[0]=b<a ? b:a;
outcome[1]=b>a ? b:a;
return outcome;
}
};