题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路描述
先对数组进行排序,然后判断该处数字与前后数字是否都不相同,那么说明就是该数字,同时考虑特殊情况,只有一次出现的数字在数组开头和末尾,同时使用flag来区分我们时第一个数字和第二个数字。
代码描述
法一:
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
sort(data.begin(),data.end());
int flag=0;
if(data[0]!=data[1])
{
*num1=data[0];
flag = 1;
}
if(data[data.size()-1]!=data[data.size()-2])
*num2=data[data.size()-1];
for(int i=1;i<data.size()-1;i++)
{
if(data[i-1]!=data[i] && data[i]!=data[i+1])
{
if(flag == 0){
*num1=data[i];
flag = 1;
}
else{
*num2=data[i];
}
}
}
}
};
法二:
使用map可以在原来数组中单个数字的基础上,绑定一个int变量,用来存储该数字的出现次数,
然后分别从头部和尾部开始查找出现一次的elem,可分别得到num1和num2
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
map<int, int> m;
for (auto elem : data){
if (m.find(elem) != m.end()){
m[elem]++;
continue;
}
m[elem] = 1;
}
for (auto it=m.begin(); it!=m.end(); it++){
if (it->second == 1){
*num1 = it->first;
break;
}
}
for (auto it=m.rbegin(); it!=m.rend(); it++){
if (it->second == 1){
*num2 = it->first;
break;
}
}
}
};