这个两次用的好啊,给人提醒用异或来做,异或和之后怎么办呢,要把这两个数分开,只有找到其中一个数再异或就能异或出另外个数了,看到牛客网里别人的做法,通过位运算把异或和是1的那一位找出来再去把所有这一位是1的数都异或一遍就能找到上诉所说的数字了,说的可能有点绕,看代码应该就懂了。
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int x = 0;
if(data.size() < 2) {
return ;
}
if(data.size() == 2) {
*num1 = data[0];
*num2 = data[1];
return ;
}
for(int i = 0; i < (int)data.size(); i++) {
x ^= data[i];
}
int index = findindex(x), y = 0;
for(int i = 0; i < (int)data.size(); i++) {
int time = index, num = data[i];
while(time--) {
num >>= 1;
}
if(num&1) {
y ^= data[i];
}
}
*num1 = y;
*num2 = (x ^ y);
}
int findindex(int x) {
int index = 0;
while((x&1) == 0 && index < 32) {
x >>= 1;
index++;
}
return index;
}
};