首页 > 试题广场 >

设计LRU缓存结构

[编程题]设计LRU缓存结构
  • 热度指数:144640 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 k ,操作次数是 n ,并有如下两个功能
1. set(key, value):将记录(key, value)插入该结构
2. get(key):返回key对应的value值

提示:
1.某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的,然后都会刷新缓存。
2.当缓存的大小超过k时,移除最不经常使用的记录。
3.输入一个二维数组与k,二维数组每一维有2个或者3个数字,第1个数字为opt,第2,3个数字为key,value
若opt=1,接下来两个整数key, value,表示set(key, value)
若opt=2,接下来一个整数key,表示get(key),若key未出现过或已被移除,则返回-1
对于每个opt=2,输出一个答案
4.为了方便区分缓存里key与value,下面说明的缓存里key用""号包裹

要求:set和get操作复杂度均为
数据范围:
示例1

输入

[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3

输出

[1,-1]

说明

[1,1,1],第一个1表示opt=1,要set(1,1),即将(1,1)插入缓存,缓存是{"1"=1}
[1,2,2],第一个1表示opt=1,要set(2,2),即将(2,2)插入缓存,缓存是{"1"=1,"2"=2}
[1,3,2],第一个1表示opt=1,要set(3,2),即将(3,2)插入缓存,缓存是{"1"=1,"2"=2,"3"=2}
[2,1],第一个2表示opt=2,要get(1),返回是[1],因为get(1)操作,缓存更新,缓存是{"2"=2,"3"=2,"1"=1}
[1,4,4],第一个1表示opt=1,要set(4,4),即将(4,4)插入缓存,但是缓存已经达到最大容量3,移除最不经常使用的{"2"=2},插入{"4"=4},缓存是{"3"=2,"1"=1,"4"=4}
[2,2],第一个2表示opt=2,要get(2),查找不到,返回是[1,-1]        
示例2

输入

[[1,1,1],[1,2,2],[2,1],[1,3,3],[2,2],[1,4,4],[2,1],[2,3],[2,4]],2

输出

[1,-1,-1,3,4]
class DlinkNode:
    def __init__(self, key=0, value=0):
        self.key = key
        self.value = value
        self.prev = None
        self.next = None

class Solution:
    def LRU(self , operators: List[List[int]], k: int) -> List[int]:
        # write code here
        self.cache = {}
        self.head = DlinkNode()
        self.tail = DlinkNode()
        self.head.next = self.tail
        self.tail.pre = self.head
        self.capacity = k
        self.size = 0
        
        def addTohead(node):
            node.pre = self.head
            node.next = self.head.next
            self.head.next.pre = node
            self.head.next = node
        
        def removenode(node):
            node.pre.next = node.next
            node.next.pre = node.pre
        
        def moveTohead(node):
            removenode(node)
            addTohead(node)
        
        def removeTail():
            node = self.tail.pre
            removenode(node)
            return node
        
        def get(key):
            if key not in self.cache:
                return -1
            else:
                node = self.cache[key]
                moveTohead(node)
                return node.value
        
        def set(key, value):
            if key not in self.cache:
                node = DlinkNode(key, value)
                self.cache[key] = node
                addTohead(node)
                self.size += 1
                if self.size>self.capacity:
                    rem = removeTail()
                    self.cache.pop(rem.key)
                    self.size -= 1
            else:
                node = self.cache[key]
                node.value = value
                moveTohead(node)
        res = []
        for opt in operators:
            if len(opt)==3:
                set(opt[1], opt[2])
            else:
                val = get(opt[1])
                res.append(val)
        return res

发表于 2021-11-23 10:53:46 回复(0)
class Solution:
    def LRU(self , operators , k ):
        # write code here
        stack = []
        kv_pair = {}
        ans = []
        for op in operators:
            if(op[0]==1):
                if(len(stack)>=k):
                    del kv_pair[stack.pop(0)]
                if(op[1] in kv_pair):
                    stack.pop(stack.index(op[1]))    
                stack.append(op[1])
                kv_pair[op[1]] = op[2]
            elif(op[0]==2):
                if(op[1] not in kv_pair):
                    ans.append(-1)
                else:
                    ans.append(kv_pair[op[1]])
                    stack.append(stack.pop(stack.index(op[1])))
        return ans

发表于 2021-10-14 10:01:21 回复(0)
class Solution:
    def LRU(self , operators , k ):
        # write code here
        key=[]
        anw=[]
        out=[]
        for i  in operators:
            if i[0]==1:
                if i[1] not in key:
                    key.append(i[1])
                    anw.append(i[2])
                    if len(key)>k:
                        key.pop(0)
                        anw.pop(0)
                else:
                    anw.pop(key.index(i[1]))
                    key.pop(key.index(i[1]))
                    key.append(i[1])
                    anw.append(i[2])
            elif i[0]==2:
                if i[1] in key:
                    out.append(anw[key.index(i[1])])
                    anw.pop(key.index(i[1]))
                    key.pop(key.index(i[1]))
                    key.append(i[1])
                    anw.append(out[-1])
                else:
                    out.append(-1)
        return out
暴力解,居然也能过
发表于 2021-08-24 15:48:26 回复(0)
class Solution:
    @staticmethod
    def clean_save(save_arrays, k, key, value):
        if len(list(save_arrays.keys())) < k:
            save_arrays[key] = value
        else:
            save_arrays.pop(list(save_arrays.keys())[0])
            save_arrays[key] = value

    def LRU(self, operators, k):
        # write code here
        save_arrays = dict()
        res_list = list()
        for opts in operators:
            if len(opts) == 3:
                _, key, value = opts
                self.clean_save(save_arrays, k, key, value)
            if len(opts) == 2:
                _, key = opts
                try:
                    value = save_arrays[key]
                except:
                    value = -1
                res_list.append(value)
                self.clean_save(save_arrays, k, key, value)
        print(save_arrays)
        return res_list
发表于 2021-08-14 10:27:13 回复(0)
class Solution:
    def LRU(self, operators, k):
        lru = []
        lrud = {}
        result=[]
        for i in operators:
            if i[0] == 1:
                lrud[i[1]] = i[2]
                if len(lru) == k and i[1] not in lru:
                    lru.pop(0)
                else:
                    if i[1] in lru:
                        lru.remove(i[1])
                lru.append(i[1])
            if i[0] == 2:
                if i[1] in lru:
                    lru.remove(i[1])
                    lru.append(i[1])
                    result.append(lrud[i[1]])
                else:
                    result.append(-1)
        return result

发表于 2021-07-29 21:09:14 回复(1)