牛客网15272会话列表:从原理到实现,会话列表的高效管理

一、问题理解
会话列表需要满足以下特性:
新消息到达时,对应会话要移动到列表顶部
如果是新会话,则插入到列表顶部
最终输出当前会话列表(从最新到最旧)
二、解题思路
使用哈希集合记录已出现的会话ID
从后往前遍历消息列表,保留每个会话最后一次出现的位置
这样自然形成从最新到最旧的顺序
三、关键算法设计
哈希集合:用于快速判断会话是否已存在
反向遍历:确保保留的是最后一次出现的位置
空间换时间:牺牲O(N)空间换取O(N)时间复杂度
四、代码实现细节
processSessionList函数处理核心逻辑
使用unordered_set实现O(1)时间复杂度的查找
反向迭代器简化遍历逻辑
输出格式处理确保符合要求
五、完整代码
#include <iostream>
#include <vector>
#include <unordered_set>
#include <algorithm>
using namespace std;
/**
* 处理会话列表更新
* @param messages 按时间顺序排列的消息会话ID列表
* @return 更新后的会话列表(按最新到最旧顺序)
*/
vector<long long> processSessionList(const vector<long long>& messages) {
vector<long long> result;
unordered_set<long long> seen; // 用于快速查找是否已存在
// 从后往前处理,保留最后一次出现的位置
for (auto it = messages.rbegin(); it != messages.rend(); ++it) {
if (seen.find(*it) == seen.end()) {
seen.insert(*it);
result.push_back(*it);
}
}
return result;
}
int main() {
int T;
cin >> T;
while (T--) {
int N;
cin >> N;
vector<long long> messages(N);
for (int i = 0; i < N; ++i) {
cin >> messages[i];
}
vector<long long> sessionList = processSessionList(messages);
// 输出结果
for (size_t i = 0; i < sessionList.size(); ++i) {
if (i != 0) cout << " ";
cout << sessionList[i];
}
cout << endl;
}
return 0;
}六、边界情况处理
空输入处理
大量重复会话ID的情况
超大ID值处理
七、实际应用
这种算法广泛应用于各类即时通讯软件,如微信、QQ等,确保会话列表始终显示最新消息。
原创内容 转载请注明出处
