题解 | #设计LRU缓存结构#
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
思路:用一个队列存储输入的(key,value)键值对,当输入operators的第一个数是1就往队列存数据,是2就读数据并把读过的数据放到队列最后。
存数据的时候记得判断队列和k的大小,最后用一个vector存储get到的结果。注意后面相同的key的数据进来时,要把前面相同key的数据删除。
(因为题目一开始的参数和返回值都用了vector,所以我就用vector写队列了)
//set函数用于向队列末尾插入一个数据
void set(vector<vector<int>> &queue, vector<int> op,int k){
for(int i=0;i<queue.size();i++){//当要新加入的key已经存在时,删除已经存在的
if(queue[i][0]==op[1]){
queue.erase(queue.begin()+i,queue.begin()+i+1);
}
}
vector<int> add;//用来存储要加入队列的两个数
add.push_back(op[1]);
add.push_back(op[2]);
queue.push_back(add);//数据加入队列
if(queue.size()>k){//判断队列是否超过k
queue.erase(queue.begin(), queue.begin()+1);
}
}
int get(vector<vector<int>> &queue,int key){//从队列中找出key对应的value,并返回
for(int i=0;i<queue.size();i++){
if(queue[i][0]==key){
int rs=queue[i][1];//用于函数返回
queue.push_back(queue[i]);//把查到的数据复制到队列尾
queue.erase(queue.begin()+i, queue.begin()+i+1);//删除原来位置的数据
return rs;
}
}
return -1;
}
vector<int> LRU(vector<vector<int> >& operators, int k) {
vector<vector<int>> queue;//队列
vector<int> rs;//存储get得到的结果
for(int i=0;i<operators.size();i++){
if(operators[i][0]==1) {//set操作
set(queue,operators[i],k);
}
else if(operators[i][0]==2){//get操作
rs.push_back(get(queue, operators[i][1]));
}
}
return rs;
}
