/**
     * LinkedHashMap本身就是一个LRU缓存,其数据结构是双链表+hashMap
     * put操作:把数据放到链表末尾,当超过指定大小后,会删除链表首节点
     * get操作:把数据放到链表末尾。
     * @param <K>
     * @param <V>
     */
    static class MyLinkedHashMap<K, V> extends LinkedHashMap<K, V>{
        private Integer maxNumber;

        public MyLinkedHashMap(int initialCapacity, float loadFactor) {
            super(initialCapacity, loadFactor, true);
        }

        public Integer getMaxNumber() {
            return maxNumber;
        }

        public void setMaxNumber(Integer maxNumber) {
            this.maxNumber = maxNumber;
        }

        @Override
        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
            return size() > getMaxNumber(); // 超过指定的大小会删除head节点
        }
    }

 public static int[] LRU (int[][] operators, int k) {
        int[] lruTmp = new int[operators.length];
        MyLinkedHashMap<Integer, Integer> map = new MyLinkedHashMap<>(16, 0.75f);
        map.setMaxNumber(k);
        int i=0;
        int j=0;
        for (int[] op: operators){
            if (op.length==3){
                map.put(op[1], op[2]);
            }else {
                lruTmp[i++]=map.getOrDefault(op[1], -1);
                j++;
            }
        }
        int[] lru = new int[j];
        for (int m=0;m<lruTmp.length; m++){
            if (lruTmp[m]!=0){
                lru[m]=lruTmp[m];
            }
        }
        return lru;
    }