Go 题解 哈希表 + 双向链表 | #设计LRU缓存结构#

设计LRU缓存结构

http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61

package main

/**
 * lru design
 * @param operators int整型二维数组 the ops
 * @param k int整型 the k
 * @return int整型一维数组
*/
type LRUStruct struct {
    Size int
    Capacity int
    Cache map[int]*NodeList
    Head, Tail *NodeList
}

type NodeList struct {
    Key, Value int
    Prev, Next *NodeList
}

func LRU( operators [][]int ,  k int ) []int {
    res := []int{}
    newlru := initLRU(k)

    for i := 0;i < len(operators); i++{
        if len(operators[i]) == 3{
            newlru.set(operators[i][1], operators[i][2])
        }else{
            res = append(res, newlru.get(operators[i][1]))
        }
    }

    return res
}

func (this *LRUStruct) get(k int) int{
    if v, ok := this.Cache[k]; ok {
        this.removeToHead(v)
        return v.Value
    }

    return -1
}

func (this *LRUStruct) set(key int, value int) {
    if v, ok := this.Cache[key]; ok {
        v.Value = value
        this.removeToHead(v)
        return 
    }
    node := initNode(key, value)
    this.addToHead(node)
    this.Cache[key] = node
    this.Size ++
    if this.Size > this.Capacity {
        n := this.removeTail()
        delete(this.Cache, n.Key)
        this.Size --
    }

    return
}

func initNode (key int, value int) *NodeList {
    return &NodeList{Key:key, Value: value}
}

func initLRU(cap int) *LRUStruct {
    l := &LRUStruct{
        Capacity: cap,
        Cache: map[int]*NodeList{},
        Head: initNode(0, 0),
        Tail: initNode(0, 0),
    }
    l.Head.Next = l.Tail
    l.Tail.Prev = l.Head

    return l
}

func (this *LRUStruct) addToHead(node *NodeList) {
    node.Next = this.Head.Next
    node.Prev = this.Head
    this.Head.Next.Prev = node
    this.Head.Next = node
}

func (this *LRUStruct) removeNode(node *NodeList) {
    node.Prev.Next = node.Next
    node.Next.Prev = node.Prev
}

func (this *LRUStruct) removeToHead(node *NodeList){
    this.removeNode(node)
    this.addToHead(node)
}

func (this *LRUStruct) removeTail() *NodeList {
    node := this.Tail.Prev
    this.removeNode(node)

    return node
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
01-17 11:44
你在各大软件投了一份又一份,你打招呼的hr一个接一个,但是只要你投过的,很快就下线了,没关系你的能量是很强,你看过的岗位招到人的速度都增加了。朋友们一个个拿着丰厚的实习回报,你却默默在家刷新邮箱,等待着那寥寥无几的面试通知。你每天一睁眼就狂投简历,你一有面试邀约就点确认。过年亲戚们围坐聊天,谈论着他们孩子的职场成就,你试图插话说自己面试过的公司数量,但他们显然不太感兴趣。你在心里自嘲,觉得他们不懂面试的艰辛、不懂得每一次面试机会的珍贵,不懂得一张张精心准备的简历背后的努力。笑你那个小侄子只会在网上刷刷职位,而你已经是各大招聘网站的常客。亲戚们夸赞自己孩子一年的成就,儿子的新工作,女儿的晋升,而...
龚新化:这帖删了呗,这跟我朋友有点相似,不过我是无所谓的😀,没什么感觉,我不轻易破防的,但是我一个朋友可能有点汗流浃背了😕,他不太舒服想睡了,当然不是我哈,我一直都是行的,以一个旁观者的心态看吧,也不至于破防吧😃,就是想照顾下我朋友的感受,他有点破防了,还是建议删了吧😯,当然删不删随你,因为我是没感觉的,就是为朋友感到不平罢了🥺
点赞 评论 收藏
分享
白菜小丑呜呜:集美,简历有点问题,+v细嗦
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客企业服务