直接上解析和自己的题解以及优化
题意理解
其实就是一个散列问题,只需要将每一次出现的数字进行次数统计,最后再按照输入顺序进行判断输出即可。次数统计可以开一个数组进行hash,重要的是如何实现按照输入顺序判断输出。
我的解法
#include<cstdio>
#include<algorithm>
using namespace std;
int N;
struct hashtable{
int number;
int count;
int index;
}hash[10010];
void init(){
for(int i=0;i<10010;i++)
{
hash[i].index=1000000;//一个比最大的序号还要大的序号即可
hash[i].count=0;
}
}
bool cmp(hashtable a,hashtable b){
return a.index<b.index;
}
int main()
{
init();
scanf("%d",&N);
int ind=1;
for(int i=0;i<N;i++)
{
int temp;
scanf("%d",&temp);
if(hash[temp].count==0){
hash[temp].index=ind;
ind++;
}
hash[temp].number=temp;
hash[temp].count++;
}
sort(hash,hash+10010,cmp);
bool flag=false;
for(int i=0;i<N;i++)
{
if(hash[i].count==1)
{
printf("%d\n",hash[i].number);
flag=true;
break;
}
}
if(!flag){
printf("None\n");
}
}
不是很好的一个思路,将hash数组扩展为一个结构体,再对其进行排序然后输出,如果数字很大或是数组很多,这个解法会比较消耗空间。
优解改进
//省略头文件以及不必要的主体部分,只看优化
int a[100010]={0};//用于接收所有输入的数据,完成按照输入顺序判断这个条件
int hashtable[10010]={0};
...
for(int i=0;i<N;i++)
{
scanf("%d",&a[i]);
hashtable[a[i]]++;
}
for(int i=0;i<N;i++)
{
if(hashtable[a[i]]==1){printf...}//简单很多
}