class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
int xorRes(vector<int>& array) { // 寻找数组中只出现一次的数字(一轮xor只能找出一个)
int sum = array[0];
for (int i = 1; i < array.size(); i++) {
sum = array[i] ^ sum;
}
return sum;
}
vector<int> FindNumsAppearOnce(vector<int>& array) {
// write code here
int sum = xorRes(array);
int cnt = 0; // 计算二进制中两个只出现一次的数字的差异位置
// 如4(100)和6(110),则在第二个二进制位有差异(xor异为1同为0)
while (sum % 2 == 0) {
sum /= 2;
cnt++;
}
vector<int> arr1;
vector<int> arr2;
vector<int> res;
for (int i = 0; i < array.size(); i++) {
if ((array[i] >> cnt)%2 == 0) // 右移至差异位,则差异位为1的元素为一类,为0的元素为另一类,
//两类分别调用xorRes即得到两个只出现一次的数字
arr1.push_back(array[i]);
else
arr2.push_back(array[i]);
}
int a = xorRes(arr1), b = xorRes(arr2);
if(a > b)
swap(a, b);
res.push_back(a);
res.push_back(b);
return res;
}
};