LRUCache LeetCode OJ

# LRUCache

class DictMap:
    def __init__(self):
        self.dict = {}
        self.size = 0
    def set(self, key, value):
        self.size+=1
        self.dict[key] = value
    def get(self, key):
        value = None
        if(self.containKey(key)):
            value = self.dict[key]
        return value
    def remove(self, key):
        del self.dict[key]
        self.size-=1
    def containKey(self, key):
        try:
            self.dict[key]
            return True
        except:
            return False

class Entry:
    def __init__(self, k, v):
        self.k = k
        self.v = v
        self.pre = None
        self.next = None
        

class LRUCache(object):

    def __init__(self, capacity):
        self.c = capacity
        self.m = DictMap()
        self.head = Entry(-1, -1)
        self.tail = Entry(1, 1)
        self.head.next = self.tail
        self.tail.pre = self.head
        

    def get(self, key):
        if(self.m.containKey(key)):
            e = self.m.get(key)
            self.__moveToHead(e)
            return e.v
        else:
            return -1
        

    def set(self, key, value):
        if(self.m.containKey(key)):
            e = self.m.get(key)
            e.v = value
            self.__moveToHead(e)
        elif(self.m.size<self.c):
            e = Entry(key, value)
            self.__moveToHead(e)
            self.m.set(key, e)
        else:
            e = Entry(key, value)
            self.__moveToHead(e)
            self.m.set(key, e)
            index = self.__removeEnd()
            self.m.remove(index)


    def __removeEnd(self):
        e = self.tail.pre
        self.tail.pre.pre.next = self.tail
        self.tail.pre = e.pre
        e.pre = None
        e.next = None
        return e.k

    def __moveToHead(self, e):
        if(e.next!=None and e.pre!=None):
            e.pre.next = e.next
            e.next.pre = e.pre
        e.pre = self.head
        e.next = self.head.next
        self.head.next.pre = e
        self.head.next = e


转载于:https://my.oschina.net/joshuashaw/blog/503983

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值