题目描述
**题解1:使用map<int,int> key为元素,int为元素个数
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& array) {
// write code here
map<int,int> m;
for(int i =0;i<array.size();i++){
if(m.find(array[i])==m.end())
m.insert(make_pair(array[i],1 ));
else
m.erase(m.find(array[i]));
//或者对该元素的value进行计数 m[array[i]]++;
}
cout<<m.size()<<endl;
vector<int> v;
for(map<int,int>:: iterator it=m.begin();it!=m.end();it++){
v.push_back((*it).first);
}
sort(v.begin(), v.end());
return v;
}
};
**题解2:位运算
位运算规则
(1) 0^0=0,0^1=1 0异或任何数=任何数
(2) 1^0=1,1^1=0 1异或任何数=任何数取反
(3) 任何数异或自己=把自己置0
图解为某大佬的,在此借鉴。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> FindNumsAppearOnce(vector<int>& array) {
// write code here
//题解2:位运算
int temp = 0;
//对所有数进行异或,
for(int i:array){
temp^=i;
}//本题目temp = 0010 ,1在倒数第二位
//位运算进行分组
// 找到那个可以充当分组去进行与运算的数
// 从最低位开始找起
int mask = 1; //如
while((temp&mask) == 0){
mask <<= 1;
}//mask = 0010
//根据倒数第二位是不是1进行分组,因为只有两个数字重复,所以分组的同时进行数据恢复
int a = 0;
int b = 0;
for(int i:array){
if((i & mask ) == 0)//分为倒数第二位不为0的一组
a^=i;
else
b^=i;
}
return {min(a,b),max(a,b)};
}
};