小云正在参与开发一个即时聊天工具,他负责其中的会话列表部分。
会话列表为显示为一个从上到下的多行控件,其中每一行表示一个会话,每一个会话都可以以一个唯一正整数id表示。
当用户在一个会话中发送或接收信息时,如果该会话已经在会话列表中,则会从原来的位置移到列表的最上方;如果没有在会话列表中,则在会话列表最上方插入该会话。
小云在现在要做的工作是测试,他会先把会话列表清空等待接收信息。当接收完大量来自不同会话的信息后,就输出当前的会话列表,以检查其中是否有bug。小云正在参与开发一个即时聊天工具,他负责其中的会话列表部分。
会话列表为显示为一个从上到下的多行控件,其中每一行表示一个会话,每一个会话都可以以一个唯一正整数id表示。
当用户在一个会话中发送或接收信息时,如果该会话已经在会话列表中,则会从原来的位置移到列表的最上方;如果没有在会话列表中,则在会话列表最上方插入该会话。
小云在现在要做的工作是测试,他会先把会话列表清空等待接收信息。当接收完大量来自不同会话的信息后,就输出当前的会话列表,以检查其中是否有bug。输入的第一行为一个正整数T(T<=10),表示测试数据组数。
接下来有T组数据。每组数据的第一行为一个正整数N(1<=N<=200),表示接收到信息的次数。第二行为N个正整数,按时间从先到后的顺序表示接收到信息的会话id。会话id不大于1000000000。
对于每一组数据,输出一行,按会话列表从上到下的顺序,输出会话id。
相邻的会话id以一个空格分隔,行末没有空格。
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)))
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();
}
}
}利用队列操作
#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;
} 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();
}
}
#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;
} # 给出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)
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;
}
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();
}
}
} //栈和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;}}
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();
}
}
}
} #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;
} #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;
}
} 存储时去重,倒序输出
算法的过程前面的解析说得很透彻了,我的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));
}
}
}
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());
}
}
}
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();
}
}
}
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();
}
}
}
#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;
}