题解 | #设计LRU缓存结构#

设计LRU缓存结构

http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61

用两个LinkedList存储数据key和value。

插入一组数据时,检查key是否存在,如果存在就删除对应数据。并重新插入一遍,以保证它们会处于最新的位置上。 如果不存在,也需要将数据插入到LinkedList中。 接着判断LinkedList长度是否达到K,如达到就删除最后一个元素。

查找数据时,先判断key是否存在,如果存在就把数据提前。并将查询到的数据存入ans。如果没找到就将-1存入ans。

最后把ans集合改为数组返回。

import java.util.*;


public class Solution {
    /**
     * lru design
     * @param operators int整型二维数组 the ops
     * @param k int整型 the k
     * @return int整型一维数组
     */
    
    public int[] LRU (int[][] operators, int k) {
        // write code here
        LinkedList<Integer> key = new LinkedList<Integer>();
        LinkedList<Integer> value = new LinkedList<Integer>();
        ArrayList<Integer> ans = new ArrayList<Integer>();
        for(int[] op:operators){
            if(op[0]==1){
                int index = key.indexOf(op[1]);
                if(index>=0){
                    key.remove(index);//移除元素
                    value.remove(index);//
                }
                key.addFirst(op[1]);
                value.addFirst(op[2]);
                if(key.size()>k){
                    value.removeLast();
                    key.removeLast();
                }
            }else{
                int index = key.indexOf(op[1]);
                if(index>=0){
                    ans.add(value.get(index));
                    key.remove(index);
                    key.addFirst(op[1]);
                    int temp = value.remove(index);
                    value.addFirst(temp);
                }else{
                    ans.add(-1);
                }
                
            }
        }
        int[] ret= new int[ans.size()];
        for(int i=0 ; i< ans.size(); i++){
            ret[i]=ans.get(i);
        }
        return ret;
    }
}
全部评论

相关推荐

2 收藏 评论
分享
牛客网
牛客企业服务