一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
1.排序后遍历
代码
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
//排序后遍历
sort(data.begin(),data.end());
vector<int> res;
if(data[0]!=data[1])
res.push_back(data[0]);
for(int i=1;i<data.size()-1;i++)
{
if(data[i]!=data[i-1]&&data[i]!=data[i+1])
res.push_back(data[i]);
}
if(data[data.size()-1]!=data[data.size()-2])
res.push_back(data[data.size()-1]);
*num1=res[0];
*num2=res[1];
}
2.hashmap
代码
{
map<int,int> hashmap;
vector<int> res;
map<int,int>::iterator it;
for(int i=0;i<data.size();i++){
hashmap[data[i]]++;
}
for(it=hashmap.begin();it!=hashmap.end();it++){
if(it->second==1)
res.push_back(it->first);
}
*num1=res[0];
*num2=res[1];
}
3.异或
代码
//异或,将所有数异或得到结果为两个不同数的异或结果,再将所得到结果二进制中从右向左中第
//一个1的索引保存,其代表两个不同数对应二进制位置的不同,再将原数组按照所得索引分两部分, 得到即为
//所求
/*
{
if(data.size()==2){
*num1=data[0];
*num2=data[1];
return ;
}
int index=0,res=0;
for(int i=0;i<data.size();i++){
res^=data[i];
}
index=Find_index(res);
*num1=0;
*num2=0;
for(int i=0;i<data.size();i++){
if(Is_bit(data[i],index)){
*num1^=data[i];
}
else{
*num2^=data[i];
}
}
}
int Find_index(int n){
int index=0;
while(((n&1)==0)&&(index<32)){
n=n>>1;
index++;
}
return index;
}
bool Is_bit(int n,int index){
n=n>>index;
return (n&1);
}