首页 > 试题广场 >

会话列表

[编程题]会话列表
  • 热度指数:9817 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

小云正在参与开发一个即时聊天工具,他负责其中的会话列表部分。

会话列表为显示为一个从上到下的多行控件,其中每一行表示一个会话,每一个会话都可以以一个唯一正整数id表示。

当用户在一个会话中发送或接收信息时,如果该会话已经在会话列表中,则会从原来的位置移到列表的最上方;如果没有在会话列表中,则在会话列表最上方插入该会话。

小云在现在要做的工作是测试,他会先把会话列表清空等待接收信息。当接收完大量来自不同会话的信息后,就输出当前的会话列表,以检查其中是否有bug。

输入描述:
输入的第一行为一个正整数T(T<=10),表示测试数据组数。
接下来有T组数据。每组数据的第一行为一个正整数N(1<=N<=200),表示接收到信息的次数。第二行为N个正整数,按时间从先到后的顺序表示接收到信息的会话id。会话id不大于1000000000。


输出描述:
对于每一组数据,输出一行,按会话列表从上到下的顺序,输出会话id。
相邻的会话id以一个空格分隔,行末没有空格。
示例1

输入

3
5
1 2 3 4 5
6
1 100 1000 1000 100 1
7
1 6 3 3 1 8 1

输出

5 4 3 2 1
1 100 1000
1 8 3 6
""""
逆序去重输出
"""

if __name__ == "__main__":
    T = int(input().strip())
    for _ in range(T):
        n = int(input().strip())
        a = list(map(int, input().strip().split()))
        ans = []
        for i in range(len(a) - 1, -1, -1):
            if a[i] not in ans:
                ans.append(a[i])
        print(' '.join(map(str, ans)))

发表于 2019-07-12 18:57:58 回复(0)
#include<iostream>
#include<vector>
#include<algorithm>//为了利用find函数
using namespace std;
int main(){
    int N;//测试样例有多少组
    cin >> N;
    while(N--){
        int n;//每一组有多少个数字
        cin >> n;
        vector<int> team;//装原始数据
        int num;//每一个数字
        for(int i = 0; i < n; i++){
            cin >> num;
            team.push_back(num);
        }
        vector<int> new_team;
        new_team.push_back(team[n - 1]);
        team.pop_back();
        for(int i = n - 2; i >= 0; i--){
            if(find(new_team.begin(), new_team.end(), team[i])==new_team.end())//在新的vector里面找不到同样的数字,则加入
                new_team.push_back(team[i]);
            team.pop_back();
        }
        for(int i = 0; i <new_team.size(); i++){
            cout << new_team[i] << " ";
        }
        cout << endl;
    }
    system("pause");
    return 0;
}
编辑于 2019-04-06 16:23:44 回复(0)
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        while(sc.hasNext()) {
            int n = sc.nextInt();
            for(int i = 0; i < n; i++) {
                ArrayList<Integer> list1 = new ArrayList<Integer>();
                list.add(list1);
                int len = sc.nextInt();
                int[] arr = new int[len];
                for(int j = 0; j < len; j++) {
                    arr[j] = sc.nextInt();
                }
                for(int k = len-1; k >= 0; k--) {
                    if(!list1.contains(arr[k])) {
                        list1.add(arr[k]);
                    }        
                }
            }
            
            for(int i = 0; i < list.size(); i++) {
                for(int j = 0; j < list.get(i).size()-1; j++) {
                    System.out.print(list.get(i).get(j) + " ");
                }
                System.out.println(list.get(i).get(list.get(i).size()-1));
            }
        }
    }
}
发表于 2018-08-03 21:32:19 回复(0)
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * @author yanglaiyi
 * @title: 会话列表
 * @projectName 牛课刷题之栈
 * @description: TODO
 * @date 2020/4/15 10:31
 */
public class 会话列表 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int anInt = sc.nextInt();//读取输入的组数

        while (anInt > 0) {
            anInt--;
            int length = sc.nextInt();//读取输入的长度,即数组长度
            int[] a = new int[length];
            for (int i = 0; i < length; i++) {//输入数组
                a[i] = sc.nextInt();
            }

            Deque<Integer> dq = new LinkedList<Integer>();
            for (int i = 0; i < a.length; i++) {
                if (dq.contains(a[i])) {
                    dq.remove(a[i]);
                    dq.addFirst(a[i]);
                } else dq.addFirst(a[i]);
            }
            for (Integer i : dq) {
                System.out.print(i + " ");
            }
            System.out.println();
            dq.clear();
        }


    }


}利用队列操作
编辑于 2020-04-15 10:55:55 回复(0)
这题 比较简单 直接从后遍历 输出之前没有输出过的即可  
用 set 来保存了不重复值
#include <iostream>
#include <vector>
#include <set>
using namespace std;

int main()
{
    int T;
    cin>>T;
    while (T--)
    {
        int N;
        cin>>N;
        vector<long long> data;//保存所有数据
        set<long long> st;     //记录所有不重复的值
        for (int i = 0; i < N; ++i) {
            long long t;
            cin>>t;
            data.push_back(t);
            st.insert(t);
        }
        vector<long long > res;
        for (int i = data.size()-1; i >=0 ; i--) {
            if(st.find(data[i])!=st.end())// 找到
            {
                res.push_back(data[i]);
                st.erase(data[i]);
            }
        }

        for (int j = 0; j <res.size() ; ++j) {//控制输出,文末不可以有空格
            if(j!=res.size()-1)
                cout<<res[j]<<" ";
            else
                cout<<res[j]<<endl;
        }

    }
    return 0;
}


发表于 2019-09-03 15:01:28 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(bf.readLine());
        for (int i = 0; i < n; i++) {
            int m = Integer.parseInt(bf.readLine());
            System.out.println(getDialogue(bf.readLine(),m));
        }
    }

    //用一个HashSet保存ID,做一个判断作用,从后往前遍历,如果set不包含该id,就添加进去。
    private static String getDialogue(String s, int m) {
        StringBuilder sb = new StringBuilder();
        HashSet<String> set = new HashSet<>();
        String[] ids = s.split(" ");
        for (int i = m - 1; i >= 0; i--) {
            if (!set.contains(ids[i])) {
                set.add(ids[i]);
                sb.append(ids[i]).append(" ");
            }
        }
        return sb.substring(0,sb.length()-1).toString();
    }
}
发表于 2019-08-06 15:09:18 回复(0)
#include <iostream>
#include <vector>
#include <map>
using namespace std;
 
int main() {
    int T, N;
    cin >> T;
    for (int i = 0; i < T; ++i) {
        cin >> N;
        map<int,int> sessions, res;
        int sessionID;
        for (int j = 0; j < N; ++j) {
            cin >> sessionID;
            if(sessions.count(sessionID) > 0 ){
                int k = sessions[sessionID];
                res.erase(k);
            }
            res[N - j] = sessionID;
            sessions[sessionID] = N - j;
        }
 
        auto iter = res.begin();
        while (iter != res.end()){
            cout << iter -> second << " ";
            iter ++;
        }
        cout << endl;
 
    }
 
    return 0;
}

发表于 2019-08-05 16:37:28 回复(1)
# 给出python代码,以供参考
# 用list实现一个栈的功能
n=int(input())
foriinrange(0,n):
    m=int(input())
    s=input()
    temp=[]
    forjinrange(0,m):
        s1=s.split(' ')[j]
        ifs1notintemp: # 如果栈中不存在,则进栈
            temp.append(s1)
        else:
            temp.remove(s1) # 如果存在,先将栈中元素删除,再进栈
            temp.append(s1)
    result=[]       
    forkinrange(0,len(temp)):
        result.append(temp.pop())
    result=' '.join(result)
    print(result)

发表于 2018-11-07 17:37:54 回复(0)

include<iostream>

include<string.h>

include<algorithm>

include<vector>

using namespace std;

//按照倒序,依次输出序号即可,已经输出的则不输出
int main(){

int n;
int t;
string id[300];
string s;
string temp;
vector<string>v;

cin>>t;

while(t--){
cin>>n;
s="";
temp="";
for(int i=0;i<n;i++){ cin>>id[i];
}
for(int i=n-1;i>=0;i--){
for(int j=i-1;j>=0;j--){
if(id[i]==id[j]) id[j]="s"; //做标记
}
}
for(int i=n-1;i>=0;i--){
if(id[i]!="s") s=s+id[i]+" ";
}
for(int i=0;i<s.size()-1;i++){
temp=temp+s[i];
}
v.push_back(temp);
}
for(int i=0;i<v.size();i++){
cout<<v[i]<<endl;
}

return 0;

}

发表于 2018-08-30 13:01:09 回复(0)
倒序遍历会话id数组,第一个遍历到的是目前会话列表的置顶,打印出来,第二个是会话列表的刚才的置顶,打印出来(如果不等于前一个id)......,用一个集合来记忆已经遍历过的会话id,如果出现了重复的id就直接跳过,因为这是属于时间更靠前的一次置顶操作,已经失效了。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine().trim());
        while(T-- > 0){
            int n = Integer.parseInt(br.readLine().trim());
            String[] strIds = br.readLine().trim().split(" ");
            HashSet<String> mem = new HashSet<>();
            for(int i = n - 1; i >= 0; i--){
                if(!mem.contains(strIds[i])){
                    mem.add(strIds[i]);
                    System.out.print(strIds[i] + " ");
                }
            }
            System.out.println();
        }
    }
}

发表于 2021-04-04 09:33:09 回复(0)
n=int(input())
for i in range(n):
    s=int(input())
    num=list(map(str,input().split()))
    res=[]
    for i in num:
        if i not in res:
            res.insert(0,i)
        else:
            res.remove(i)
            res.insert(0,i)
    print(" ".join(res))

发表于 2020-04-10 14:45:22 回复(0)
//栈和unodered_map集合一起配合的方法 #include<iostream>
#include<stack>
#include<unordered_map>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        stack<long> s;
        for(int i=0;i<n;i++)
        {
            int num;
            cin>>num;
            s.push(num);
        }
        unordered_map<long,int> m;
        int i=0;
        while(!s.empty())
        {
            if(m.end()==m.find(s.top()))
            {
                m.insert({s.top(),i++});
                cout<<s.top()<<" ";
            }
            s.pop();
        }
        cout<<endl;
    }
}
//vector和unordered_map集合配合使用
#include<iostream>
#include<vector>
#include<unordered_map>
usingnamespacestd;
intmain()
{
    intT;
    cin>>T;
    while(T--)
    {
        intn;
        cin>>n;
        vector<long> v;
        for(inti=0;i<n;i++)
        {
            intnum;
            cin>>num;
            v.push_back(num);
        }
        unordered_map<long,int> m;
        for(inti=v.size()-1;i>=0;i--)
        {
            if(m.end()==m.find(v[i]))
            {
                m.insert({v[i],i});
                cout<<v[i]<<" ";
            }
        }
        cout<<endl;
    }
}
编辑于 2020-02-20 09:29:34 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            for(int i = 0; i<n; i++){ 
                Stack<Integer> stack = new Stack<>();
                int number = sc.nextInt();
                for(int j = 0; j<number; j++){
                    stack.push(sc.nextInt());
                }
                Set<Integer> set = new LinkedHashSet<>();//使用LinkedHashSet能保证不重复且在set中的顺序与存入顺序一致
                while(!stack.isEmpty()){
                    set.add(stack.pop());
                }
                for(int next : set){
                    System.out.print(next+" ");
                }
                System.out.println();
            }
        }
    }
}

发表于 2020-01-20 17:11:06 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int T,n;
    cin>>T;
    while(T--){
        cin>>n;
        int a[n];
        map<int,bool> vis;
        vector<int> v;
        for(int i=0;i<n;i++)
            cin>>a[i];
        bool first = true;
        for(int i=n-1;i>=0;i--){
            if(vis.find(a[i])==vis.end()){
                vis[a[i]] = true;
                v.push_back(a[i]);
                if(first){
                    cout<<a[i];
                    first = false;
                }else
                    cout<<" "<<a[i];
            }
        }
        cout<<endl;
    }
    return 0;
}

发表于 2019-11-16 11:44:18 回复(0)
#include <iostream>
#include <vector>
using namespace std;
int main() {
	bool check(vector<int>* s, int num);
	int eNum = 0;
	scanf("%d", &eNum);
	for (int i = 0; i < eNum; i++) {
		int size = 0;
		scanf("%d", &size);
		vector<int> mesId;
		for (int j = 0; j < size; j++) {
			int num = 0;
			cin >> num;
			mesId.push_back(num);
			for (int k = 0; k < mesId.size() - 1;) {
				if (mesId[k] == num) {
					mesId.erase(mesId.begin() + k);
					continue;
				}
				k++;
			}
		}
		for (int j = mesId.size(); j > 0; j--) {
			if (j != mesId.size())
					cout << ' ';
			cout << mesId[j - 1];
		}
		cout << endl;
	}
}
存储时去重,倒序输出
发表于 2019-09-12 22:43:34 回复(0)

算法的过程前面的解析说得很透彻了,我的AC就是用java现成数据结构来精简代码,供大家参考

import java.util.*;
import static java.lang.System.in;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(in);
        int m = Integer.parseInt(sc.nextLine());
        while (m-- > 0) {
            sc.nextLine();
            String[] ids = sc.nextLine().split(" ");
            LinkedHashSet<String> set = new LinkedHashSet<>();
            List list = Arrays.asList(ids);
            Collections.reverse(list);
            set.addAll(list);
            StringBuilder sb = new StringBuilder();
            for (String item : set) {
                sb.append(item).append(" ");
            }
            System.out.println(sb.substring(0,sb.length()-1));
        }
    }
}
发表于 2019-08-07 12:37:59 回复(0)
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        for (int i = 0; i < t; i++) {
            int n = scanner.nextInt();
            String[] id = new String[n];
            for (int j = 0; j < n; j++) {
                id[j] = scanner.next();
            }
            ArrayList<String> list = new ArrayList<>();
            for (int j = id.length - 1; j >= 0; j--) {
                if (!list.contains(id[j])) {
                    list.add(id[j]);
                }
            }
            StringBuilder sb = new StringBuilder();
            for (String str : list) {
                sb.append(str + " ");
            }
            System.out.println(sb.toString().trim());
        }
    }
}
发表于 2019-07-12 10:45:16 回复(0)
import java.util.HashSet;
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int group_len = sc.nextInt();
        int[][] groups = new int[group_len][];
        for(int i = 0; i < group_len; i++){
            int len = sc.nextInt();
            groups[i] = new int[len];
            for(int j = 0; j < len; j++){
                groups[i][j] = sc.nextInt();
            }
        }
        sc.close();
        for(int i = 0; i < group_len; i++){
            HashSet<Integer> set = new HashSet<>();
            for(int j = groups[i].length - 1; j >= 0; j--){
                if(j != groups[i].length - 1 && set.contains(groups[i][j])) continue;
                set.add(groups[i][j]);
                System.out.print(groups[i][j] + " ");
            }
            System.out.println();
        }
 
    }
}

发表于 2019-07-10 11:53:41 回复(0)

思路:每次都将元素压入栈中,然后在逐个弹出栈,每次弹出的时候判断HashSet里面有没有该元素,如果没有就打印元素并将元素加到HashSet中,如果HashSet中有该元素,则什么都不做。

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t-- > 0) {
            Stack<Integer> stack = new Stack<>();
            HashSet<Integer> set = new HashSet<>();
            int n = sc.nextInt();
            for (int i = 0; i < n; i++) {
                stack.push(sc.nextInt());
            }
            while (!stack.isEmpty()) {
                int temp = stack.pop();
                if (!set.contains(temp)) {
                    set.add(temp);
                    System.out.print(temp + " ");
                }
            }
            System.out.println();
        }
    }
}
发表于 2019-07-06 19:59:29 回复(0)
#include <iostream>
#include <map>
#include <vector>
using namespace std;

int main()
{
    int n, m;
    cin >> n;
    vector<vector<int>> v(n);
    vector<vector<int>> vRes;
    for (int i = 0; i < n; i++)
    {
        cin >> m;
        v[i].resize(m);
        for (int j = 0; j < m; j++)
        {
            cin >> v[i][j];
        }
    }
    for (int i = 0; i < n; i++)
    {
        vector<int> vTmp;
        map<int, int> mp;
        for (int j = v[i].size() - 1; j >= 0; j--)
        {
            if (mp[v[i][j]] == 0)
            {
                mp[v[i][j]] = 1;
                vTmp.push_back(v[i][j]);
            }
        }
        vRes.push_back(vTmp);
    }
    for (int i = 0; i < vRes.size(); i++)
    {
        for (int j = 0; j < vRes[i].size() - 1; j++)
        {
            cout << vRes[i][j] << " ";
        }
        cout << vRes[i][vRes[i].size() - 1] << endl;
    }
    return 0;
}

发表于 2018-08-07 10:09:40 回复(2)