LRU缓存--利用JS里Map对象可以记住插入顺序

53 阅读1分钟

算法题描述

image.png LRU缓存这道题最关键在于如何在缓存满时插入的新数据时替换时最旧的数据。而JS Map中正好有一个方法能够记住键的插入顺序。

  •  keys() – 返回一个新的 Iterator,该 Iterator 包含元素的键,以插入顺序排列。
  •  next() – 用于遍历迭代器,返回下一个元素的信息。

示例:

let map = new Map();
map.set(1, 11);
map.set(2, 22);
map.set(3, 33);
console.log(map.keys());  //[Map Iterator] { 1, 2, 3 }
console.log(map.keys().next());  //{ value: 1, done: false }
console.log(map.keys().next().value);  //1
map.delete(1);
map.set(1, 11);
console.log(map.keys());  //[Map Iterator] { 2, 3, 1 }
console.log(map.keys().next());  //{ value: 2, done: false }
console.log(map.keys().next().value);  //2

通过保存迭代器也可以获取之后的值,又或者通过将map.keys()转化为数组来获取:

let map = new Map();
map.set('一', 11);
map.set('二', 22);
map.set('三', 33);

let iterator = map.keys();
console.log(iterator.next());  // { value: '一', done: false }
console.log(iterator.next().value);// 二
console.log(iterator.next());  //{ value: '三', done: false }

let arr = Array.from(map.keys());
console.log(arr)  // ['一', '二', '三' ]
console.log(arr[2]);  // 三
console.log(arr[1]);  // 二

解题:

/**
 * @param {number} capacity
 */
var LRUCache = function(capacity) {
    this.capacity = capacity;  //缓存容量
    this.map = new Map();
};

/** 
 * @param {number} key
 * @return {number}
 */
LRUCache.prototype.get = function(key) {
    if(this.map.has(key)){
        let temp = this.map.get(key);
        this.map.delete(key);
        this.map.set(key,temp);
        return temp;
    }else{
        return -1;
    }
};

/** 
 * @param {number} key 
 * @param {number} value
 * @return {void}
 */
LRUCache.prototype.put = function(key, value) {
    if(this.map.has(key)){
        this.map.delete(key);
    }
    this.map.set(key,value);
    if(this.map.size > this.capacity){
        this.map.delete(this.map.keys().next().value);
    }
};