PAT A1041 Be Unique

题目

直接上解析和自己的题解以及优化

题意理解

其实就是一个散列问题,只需要将每一次出现的数字进行次数统计,最后再按照输入顺序进行判断输出即可。次数统计可以开一个数组进行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...}//简单很多
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值