题解
题目难度:中等难度
知识点:栈、数组、map
方法(一)
将员工id放入id数组中,构造一个辅助数组,我们依次从id数组的末尾取出数据,当区最末尾数据时,直接打印,并将该数放入辅助数组之中,然后从id数组末尾取下一个数据,与已经放入辅助数组中的数据逐一比较,若没有访问过,打印该数据并且把该数据存入辅助数组之中,若在辅助数组中出现,那么该数据不打印直接判断id数组中的下一个id值,直到判断完Id数组的0号下标。
#include<iostream> #include<stdio.h> #define Maxn 200 using namespace std; int main(){ int T; int id[Maxn]; int ans[Maxn]; cin>>T; while(T){ int N; cin>>N; for(int i=0;i<N;i++){ cin>>id[i]; } int k=1; ans[0]=id[N-1]; cout<<id[N-1]<<" "; for(int i=N-2;i>=0;i--){ int flat=0; for(int j=0;j<k;j++){ if(ans[j]==id[i]){ flat=1; break; } } if(flat==1) continue; else{ cout<<id[i]<<" "; ans[k++]=id[i]; } } T--; cout<<endl; } return 0; }
方法(二)更优
输出id的问题可抽象为:id按照先入后出的顺序输出,唯一不同在遇到已经输出过的数字时直接跳过,不进行输出。考虑先入后出特点采用栈对数据进行存储,当输出数据时,判断map中是否已经存在该数字,若已经存在直接弹出栈顶元素,否者将该数放入map中,输出栈顶元素,最后弹出栈顶元素。
#include<iostream> #include<stack> #include<map> using namespace std; int main(){ stack<int> s; map<int,int> m; int T; cin>>T; while(T){ m.erase(m.begin(),m.end());//map重复使用,当对一组新数据,我们需要将其清空 int N,id; cin>>N; for(int i=1;i<=N;i++){ cin>>id; s.push(id); } for(int i=1;i<=N;i++){ id=s.top(); if(m.count(id)==0){ cout<<s.top()<<" "; m[id]=1; } s.pop(); } T--; cout<<endl; } return 0; }