牛客题解 | 会话列表_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&gt;&gt;T;
    while(T){
      int N;
      cin&gt;&gt;N;
      for(int i=0;i<n;i++){ cin>&gt;id[i];
    }
    int k=1;
      ans[0]=id[N-1];
      cout&lt;<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&gt;&gt;T;
    while(T){
      m.erase(m.begin(),m.end());//map重复使用,当对一组新数据,我们需要将其清空
        int N,id;
         cin&gt;&gt;N;
        for(int i=1;i&lt;=N;i++){
           cin&gt;&gt;id;
            s.push(id);
        }
        for(int i=1;i&lt;=N;i++){
          id=s.top();
          if(m.count(id)==0){
              cout&lt;</int,int></int></map></stack></k;j++){></id[n-1]<<"></n;i++){></stdio.h></iostream>
posted @ 2025-03-03 18:44  wangxiaoxiao  阅读(5)  评论(0)    收藏  举报