用C++某种聊天工具,每个好友的id都是唯一的,当用户接收到信息后,如果会话窗口之前没有与该好友的聊天信息,则在通信列表里,会将新接收的消息的好友id置顶,如果会话窗口中已有与该好友的聊天信息,则将该好友的id移动到通讯列表的顶端。请根据要求实现该功能。 输入:第一行为整数N,代表有N组测试数据,接下来的N组测试中,每组第一个为整数T,代表有T条通讯,然后有T个整数,按时间先后顺序表示接收到讯息的好友id。 输出:按照通讯列表从上到下的顺序输出好友id,每个id以空格分隔。 样例输入: 3 5 1 2 3 4 5 6 1 2 3 3 2 1 7 1 5 2 2 1 7 1 样例输出: 5 4 3 2 1 1 2 3 1 7 2 5
时间: 2024-02-27 21:59:24 浏览: 75
下面是 C++ 的实现代码,我已经添加了必要的注释来说明程序实现的细节。
```cpp
#include <iostream>
#include <map>
#include <list>
using namespace std;
int main() {
int n;
cin >> n;
while (n--) {
int t;
cin >> t;
map<int, list<int>::iterator> mp; // 存储好友 id 和对应的 list 迭代器
list<int> lst; // 存储通讯列表
for (int i = 0; i < t; i++) {
int id;
cin >> id;
auto it = mp.find(id); // 查找好友 id 是否已经存在于通讯列表中
if (it == mp.end()) { // 如果不存在,就在通讯列表的顶端插入该好友 id,并在 map 中存储好友 id 和对应的 list 迭代器
lst.push_front(id);
mp[id] = lst.begin();
} else { // 如果已经存在,就将该好友 id 对应的 list 迭代器移动到通讯列表的顶端
lst.splice(lst.begin(), lst, it->second);
}
}
for (auto id : lst) { // 遍历通讯列表输出好友 id
cout << id << " ";
}
cout << endl;
}
return 0;
}
```
对于每组测试数据,我们先读入好友的数量 $T$,然后依次读入 $T$ 个好友 id,按照题目要求在通讯列表中进行操作,最后遍历通讯列表输出好友 id。
时间复杂度为 $O(N \cdot T)$,其中 $N$ 为测试数据组数,$T$ 为每组测试数据中的好友数量。
阅读全文