牛客网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等,确保会话列表始终显示最新消息。
原创内容 转载请注明出处