题解 | #设计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; }