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

设计LRU缓存结构

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

public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * lru design * @param operators int整型二维数组 the ops * @param k int整型 the k * @return int整型一维数组 */ class LRUCache { class Node { var val: Int var key: Int var next: Node? var pre: Node? init() { val = 0; key = 0 } init(_ key: Int, _ val: Int) { self.val = val; self.key = key } }

    var map: [Int: Node] = [:]
    var dummyHead = Node()
    var dummyTail = Node()
    var capacity: Int
    init(_ capacity: Int) {
        self.capacity = capacity
        dummyHead.next = dummyTail
        dummyTail.pre = dummyHead
    }

    func add(_ node: Node) {
        
        let next = dummyHead.next
        node.next = next
        node.pre = dummyHead
        dummyHead.next = node
        next?.pre = node
        // debugPrinter()
    }

    func remove(_ node: Node) {
        // debugPrinter()
        let pre = node.pre
        let next = node.next
        pre?.next = next
        next?.pre = pre
    }

    func put(_ key: Int, _ value: Int) {
        if let node = map[key] {
            remove(node)

        } else if map.count == capacity {
            // capacity is not enough, delete tha last from linkedlist and map
            let key = dummyTail.pre?.key
            
            remove(map[key!]!)
            map[key!] = nil
            
        }
        let newNode = Node(key, value)
        map[key] = newNode
        add(newNode)
    }

    func get(_ key: Int) -> Int {
        if let node = map[key] {
            remove(node)
            add(node)
            return node.val
        } else {
            return -1
        }
    }

// func debugPrinter() {
//     var cur = dummyHead.next
//     while let node = cur {
//         print("\(node.key):\(node.val)", terminator: ", ")
//         cur = cur?.next
//     }
//     print("")
// }
}

func LRU ( _ operators: [[Int]],  _ k: Int) -> [Int] {
    // write code here
    var lruCache = LRUCache(k)
    var res: [Int] = []
    for i in 0..<operators.count {
        let op = operators[i]
        if op[0] == 1 {
           lruCache.put(op[1],op[2])
        } else if op[0] == 2{
           res.append(lruCache.get(op[1]))
            
        }
    }
    return res
    
}

}

全部评论

相关推荐

10-22 19:44
门头沟学院 Java
面了100年面试不知...:那我得去剪个头
点赞 评论 收藏
分享
10-15 18:02
已编辑
香港中文大学 golang
秋招有幸一开始就拿了淘天的笔面,并且美团转正的意向也顺利通过后续在淘天和字节两个&nbsp;9&nbsp;月主要流程都走到了&nbsp;hr&nbsp;面,国庆节后一个通过,一个横向挂了其他面过的包括:b&nbsp;站一面挂&nbsp;八股还行,最后手撕给了个笔试压轴限时&nbsp;15min...整段垮掉阿里控股&nbsp;kpi一面➕换部门走到二面,控股的都不喜欢开摄像头京东一面挂&nbsp;常规问题,但是疑似成都&nbsp;base&nbsp;hc&nbsp;很少,并且透露了已经转正,目前池子里无人捞腾讯正在二面&nbsp;一面体验不错,还指出了要改进的地方,提示二面不会再问问过的问题快手一面未知小红书一面未知字节换部门一面不喜欢业务,又回到了人才库大麦约面,准备拒掉虾皮一面&nbsp;无后续流程,面试聊的还行,感觉上海&nbsp;base&nbsp;池子满了---------------------------------------------------------------------------感觉秋招可以结束了,后续感觉走完这个腾讯流程就随缘面面&nbsp;t&nbsp;和&nbsp;b,主包家在南京,奈何南京没啥好的民营企业和互联网氛围,以及好国企又太难进,不知道淘天这个意向够不够直接结束秋招了...今天去深圳&nbsp;nip&nbsp;主场看了一下入围赛,主队不是这两家,还是觉得&nbsp;ig&nbsp;可惜了,有很好的机会没有抓住。感触和我字节&nbsp;hr&nbsp;面挂一样评论区有推荐的字节杭州上海base的业务线或者有字节&nbsp;hr&nbsp;uu&nbsp;可以捞一下吗?
肖先生~:大佬都这么强了还要干啥啊
我的求职进度条
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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