题解 | #牛牛的门票缓存系统#

牛牛的门票缓存系统

https://www.nowcoder.com/practice/9a02797f62c64c89aa0391f23eb55e35

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param operations string字符串一维数组 
# @param data int整型二维数组 
# @param capacity int整型 
# @return int整型一维数组
#
class Solution:
    def performOperation(self , operations: List[str], data: List[List[int]], capacity: int) -> List[int]:
        # write code here
        # 函数 getTicket 和 putTicket 必须以平均时间复杂度 O(1) 运行。
        # 也就是不能搜索,获取和修改只能哈希
        # 如果插入操作导致缓存中门票数量超过容量 capacity,则应该逐出最不经常使用的门票。
        # 这里理解最不经常使用就是使用次数最少的
        class TicketCache:
            def __init__(self, capacity):
                self.capacity = capacity
                # 用字典来记录tickid,以及操作序号,便于查询
                self.d = dict()
                self.dcnt = dict() # 记录使用次数
                self.size = 0
            
            def getTicket(self, ticketId):
                if ticketId in self.d:
                    self.dcnt[ticketId] += 1 # 更新一次 
                    return self.d[ticketId]
                else:
                    return -1
            
            def putTicket(self, ticketId, ticketInfo):
                if self.capacity == 0:
                        return # 直接结束
                        
                if ticketId in self.d: # update
                    self.d[ticketId] = ticketInfo
                    self.dcnt[ticketId] += 1 # 更新一次 

                else: # 需要添加,首先检查capacity
                    if self.size == self.capacity: # 已经很满了,先删除
                        # 找到cnt最小的对
                        tempd = sorted(self.dcnt.items(), key = lambda x: x[1])
                        to_remove_id, _ = tempd[0] # (id, cnt) # 最先被操作的
                        del self.dcnt[to_remove_id]
                        del self.d[to_remove_id]
                        self.size -= 1
                    self.size += 1 
                    self.d[ticketId] = ticketInfo
                    self.dcnt[ticketId] = 0 # 初始化
        
        ticket = TicketCache(capacity)
        ans = []
        for i in range(len(operations)):
            tdata = data[i]
            if operations[i] == "putTicket":
                ticket.putTicket(tdata[0], tdata[1])
            else: # getTicket
                ret = ticket.getTicket(tdata[0])
                ans.append(ret)
            print(ticket.d)
        return ans

这题题目不难,但是容易有歧义,题目说移除最不常使用的,我开始以为是距离现在最远的上次操作的ticket,其实只是移除操作次数最少的ticket。注意这点。要实现O(1)put和get,考虑使用dict。一个dict来记录数据,另一个来记录操作次数。

全部评论

相关推荐

西松屋:说明原部门有机会把
点赞 评论 收藏
分享
01-17 08:34
门头沟学院 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务