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


全部评论

相关推荐

点赞 评论 收藏
分享
希望被捞的猫头鹰很理智:大概率待遇低怕硕士跑路
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务