牛客题解 | 会话列表_1
题目
题解
题目难度:中等难度
知识点:栈、数组、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<</int,int></int></map></stack></k;j++){></id[n-1]<<"></n;i++){></stdio.h></iostream>