#5 明明的随机数

Time Limit: 1000 ms Memory Limit: 128 MB
Description
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
Input
有2行,

第1行为1个正整数,表示所生成的随机数的个数:N

第2行有N个用空格隔开的正整数,为所产生的随机数。
Output
也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
Sample Input
10
20 40 32 67 40 20 89 300 400 15
Sample Output
8
15 20 32 40 67 89 300 400

这道题明显属于排序类型,关键在于如何处理“去重”,两种解决方法,一种是引入栈,另一种是引入队列,队列相对简单,两种解法都发一下,都AC了。

栈解法:

#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
int n,x[101];
stack<int>ans;
bool pnt(int a,int b){
    return a>b;
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&x[i]);
    }//不怎么华丽的输入
    sort(x+0,x+n,pnt);//由于输出时会倒序输出,这个时候存入栈的顺序
                      //是从大到小,倒过来输出就是从小到大
    for(int i=0;i<n;i++){
        if(!ans.empty()&&x[i]==ans.top())continue;
        else ans.push(x[i]);
                               //如果栈是空的,ans.top()返回无值,会RE
    }
    printf("%d\n",ans.size());
    while(!ans.empty()){
        printf("%d ",ans.top());
        ans.pop();
    }//不怎么华丽的正常输出
}

队列(单链表)解法:

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
queue<int>ans;
int n,x[101];
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&x[i]);
    }//同理
    sort(x+0,x+n);//由于后面正序输出,所以从小到大排列
    for(int i=0;i<n;i++){
        if(!ans.empty()&&x[i]==ans.back())continue;//同理
        else ans.push(x[i]);
    }
    printf("%d\n",ans.size());
    while(!ans.empty()){
        printf("%d ",ans.front());
        ans.pop();
    }//同理
}

猜你喜欢

转载自blog.csdn.net/qq_42991479/article/details/82194078