题解 | #设计LRU缓存结构#

设计LRU缓存结构

http://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84

//妈妈,我出息了
type Node struct {
    key, value int 
    pre, next *Node
}
func initNode(key, value int) *Node {
    return &Node {
        key : key,
        value : value,
    }
}
type DoubleLinkedList struct {
    head, tail *Node
    size int
}
func initDoubleLinkedList() *DoubleLinkedList {
    dll := &DoubleLinkedList {
        head : initNode(0, 0),
        tail : initNode(0, 0),
        size : 0,
    }
    dll.head.next = dll.tail
    dll.tail.pre = dll.head
    return dll
}
func (this *DoubleLinkedList) addLast(x *Node) {
    x.pre = this.tail.pre
    x.next = this.tail
    this.tail.pre.next = x
    this.tail.pre = x
    this.size++
}
func (this *DoubleLinkedList) remove (x *Node) {
    x.pre.next = x.next
    x.next.pre = x.pre
    x.pre = nil
    x.next = nil
    this.size--
}
func (this *DoubleLinkedList) removeFirst() *Node {
    if this.head.next == this.tail {
        return nil
    }
    first := this.head.next
    this.remove(first)
    return first
}

type Solution struct {
    capacity int 
    knmap map[int]*Node
    cache *DoubleLinkedList
}

func Constructor(capacity int) Solution {
    lruCache := Solution {
        capacity : capacity,
        knmap : map[int]*Node{},
        cache : initDoubleLinkedList(),
    }
    return lruCache
}
func (this *Solution) makeRecently (key int) {
    node := this.knmap[key]
    this.cache.remove(node)
    this.cache.addLast(node)
}
func (this *Solution) addRecently (key, value int) {
    node := initNode(key, value)
    this.cache.addLast(node)
    this.knmap[key] = node
}
func (this *Solution) deletekey(key int)  {
    node := this.knmap[key]
    this.cache.remove(node)
    delete(this.knmap, key)
}
func (this *Solution) deleteLRU() {
    deleteLRU := this.cache.removeFirst()
    delete(this.knmap, deleteLRU.key)
}
func (this *Solution) get(key int) int {
    node, exist := this.knmap[key]
    if !exist {
        return -1
    }
    this.makeRecently(key)
    return node.value
}


func (this *Solution) set(key int, value int)  {
    _, exist := this.knmap[key]
    if exist {
        this.deletekey(key)
        this.addRecently(key, value)
    }else {
        if this.cache.size == this.capacity {
            this.deleteLRU()
        }
        this.addRecently(key, value)
    }
}

/**
 * Your Solution object will be instantiated and called as such:
 * solution := Constructor(capacity);
 * output := solution.get(key);
 * solution.set(key,value);
 */
全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务