题解 | #牛牛的门票缓存系统#
牛牛的门票缓存系统
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来记录数据,另一个来记录操作次数。
