//先排序然后查找
void FindNumsAppearOnce1(vector<int> data, int* num1, int *num2) {
if (data.size() < 2)
return;
sort(data.begin(), data.end());
vector<int> res;
for (int i = 0; i < data.size(); i++)
{
if ((i + 1) < data.size() && data[i] == data[i + 1])
i++;
else
res.push_back(data[i]);
}
*num1 = res[0];
*num2 = res[1];
}
//利用异或的思想
void FindNumsAppearOnce2(vector<int> data, int* num1, int *num2) {
if (data.size() < 2)
return;
int myxor = 0;
int flag = 1;
for (int i = 0; i < data.size(); ++i)
myxor ^= data[i];
//利用异或结果的最低位为1的flag将数组中的数字分为两类,一类是与flag按位与为0,另一类为不为0
//假如flag=1说明两个数的最低位不同,flag=2次最低位不同,flag=4。。。依次类推
while ((myxor & flag) == 0)
flag <<= 1;
*num1 = myxor;
*num2 = myxor;
for (int i = 0; i < data.size(); ++i){
if ((flag & data[i]) == 0) //将数字分为两组进行异或操作
*num1 ^= data[i];
else
*num2 ^= data[i];
}
}
//哈希表实现
void FindNumsAppearOnce3(vector<int> data, int* num1, int *num2){
if (data.size() < 2)
return;
map<int, int> hash;
for (int i = 0; i < data.size();i++)
{
hash[data[i]]++;
}
vector<int> res;
for (int i = 0; i < data.size(); i++)
{
if (hash[data[i]] == 1)
res.push_back(data[i]);
if (res.size() == 2)
break;
}
*num1 = res[0];
*num2 = res[1];
}
//set查找
void FindNumsAppearOnce4(vector<int> data, int* num1, int *num2) {
set<int> save;
set<int>::iterator iter;
for (int i = 0; i < data.size(); i++){
if (save.find(data[i]) == save.end())
save.insert(data[i]);
else{
iter = save.find(data[i]);
save.erase(iter);
}
}
iter = save.begin();
*num1 = *iter;
*num2 = *(++iter);
}