实现一个LRU链表(元素类型为整形),链表大小为N,当往链表中插入元素时(元素可能重复,如果是插入重复元素,那么不新增元素,只调整元素在链表中的位置),如果链表满了,那么淘汰最近没有被访问(这里只考虑插入这一个访问操作,不考虑查找)的元素,然后插入新元素。当插入M个元素后(M > N),打印链表中的所有元素。
实现一个LRU链表(元素类型为整形),链表大小为N,当往链表中插入元素时(元素可能重复,如果是插入重复元素,那么不新增元素,只调整元素在链表中的位置),如果链表满了,那么淘汰最近没有被访问(这里只考虑插入这一个访问操作,不考虑查找)的元素,然后插入新元素。当插入M个元素后(M > N),打印链表中的所有元素。
第一行为链表大小N。第二行为整数集合(可能有重复的元素),整数之间用空格分隔。这个集合的顺序,表示不断访问(插入)的顺序,即:将该集合中的元素逐个插入LRU链表中。
插入所有元素后,将链表中的元素打印出来。所有元素打印到一行,元素(整数)之间用空格分隔。
3 1 2 4 2 6 9 6
6 9 2
#include <iostream>
#include <map>
#include <list>
#include <algorithm>
using namespace std;
class Lru {
public:
Lru(int s) : capacity(s) {};
void print();
void put(int k);
private:
map<int, list<int>::iterator> lru_map;
list<int> lru_list;
int capacity;
};
void Lru::put(int k) {
if (lru_map.find(k) == lru_map.end()) {
//超出容量删除
if (lru_list.size() == capacity) {
lru_map.erase(lru_list.back());
lru_list.pop_back();
}
//置入链表头
lru_list.push_front(k);
lru_map[k] = lru_list.begin();
} else {
//移动到链表头部
lru_list.splice(lru_list.begin(),lru_list, lru_map[k]);
lru_map[k] = lru_list.begin();
}
}
void Lru::print() {
for (auto it = lru_list.begin(); it != lru_list.end(); it++) {
cout << *it << " ";
}
}
int main() {
int s;
cin >> s;
auto lru_item = Lru(s);
while(cin >> s) {
lru_item.put(s);
}
lru_item.print();
return 0;
}
n = int(input())
nums = list(map(int, input().split()))
lru = []
for i in nums:
if len(lru)<n:
if i in lru:
lru.insert(0, lru.pop(lru.index(i)))
else:
lru.insert(0, i)
else:
if i in lru:
lru.insert(0, lru.pop(lru.index(i)))
else:
lru.pop()
lru.insert(0, i)
print(" ".join(map(str, lru))) #include <bits/stdc++.h>
using namespace std;
int main()
{
int size;
int num;
cin >> size;
list<int> lru;
vector<int> r;
unordered_set<int> hash;
while(cin >> num)
{
if(hash.find(num) == hash.end())
{
hash.insert(num);
if(lru.size() >= size)
{
hash.erase(lru.front());
lru.pop_front();
}
lru.push_back(num);
}else
{
lru.remove(num);
lru.push_back(num);
}
}
for(auto it = lru.rbegin();it != lru.rend();it++)
cout << *it << " ";
return 0;
}