题解

题目难度:中等难度

知识点:栈、数组、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;
}

【注】多组数据map共用,处理一组新数据之前我们需要将其清空