算法题

146. LRU 缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

示例:

输入
[“LRUCache”, “put”, “put”, “get”, “put”, “get”, “put”, “get”, “get”, “get”]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1); // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2); // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1); // 返回 -1 (未找到)
lRUCache.get(3); // 返回 3
lRUCache.get(4); // 返回 4

  1. /**
  2. * @param {number} capacity
  3. */
  4. var LRUCache = function(capacity) {
  5. this.capacity = capacity
  6. this.map = new Map()
  7. };
  8. /**
  9. * @param {number} key
  10. * @return {number}
  11. */
  12. LRUCache.prototype.get = function(key) {
  13. let temp = this.map.get(key)
  14. if (temp != null) {
  15. this.map.delete(key)
  16. this.map.set(key, temp)
  17. return temp
  18. } else {
  19. return -1
  20. }
  21. };
  22. /**
  23. * @param {number} key
  24. * @param {number} value
  25. * @return {void}
  26. */
  27. LRUCache.prototype.put = function(key, value) {
  28. if (this.map.get(key) != null) {
  29. this.map.delete(key)
  30. } else if (this.map.size === this.capacity) {
  31. this.map.delete(this.map.keys().next().value)
  32. }
  33. this.map.set(key, value)
  34. };

手写题

  1. 实现Promise.race()
  1. /**
  2. * @param {Array<Promise>} promises
  3. * @return {Promise}
  4. */
  5. function race(promises) {
  6. // your code here
  7. return new Promise((resolve, reject) => {
  8. promises.forEach(promise => {
  9. Promise.resolve(promise).then(data => {
  10. return resolve(data)
  11. }).catch(err => {
  12. return reject(err)
  13. })
  14. })
  15. })
  16. }