假设我们有一个请求列表,其中每个列表包含类似[uid,time_sec]的元素(uid是用户ID,time_sec是时间戳)。这表示其id为uid的用户已在时间戳记time_sec上请求网站。我们还有两个值u和g,其中u表示给定uid在任何<60秒帧中允许的最大请求数,而g是全局在任何<60秒帧中允许的最大请求数。现在,如果我们要一个接一个地处理每个请求并对其进行速率限制。并且,如果有多个用户同时存在请求,则将首先处理具有较低uid的请求,否则将删除该请求。我们必须找到将成功处理的请求总数。
因此,如果输入像是请求= [[0,1],[1,2],[1,3]] u = 1 g = 5,则输出将为2,因为用户0和1可以在时间1和2,但是来自用户1的第二个请求将不会被处理,因为一个用户最多可以在60秒的帧中发送1请求。
为了解决这个问题,我们将遵循以下步骤-
最后:=一个空的映射
总计:=空双头队列
窗口时间:= 60
根据时间对请求进行排序,如果相同,则根据uid进行排序
数量:= 0
对于请求中的每个r,
在last [uid]末尾插入时间
在总计末尾插入时间
数量:=数量+ 1
从last [uid]删除左项
删除总计的左项
[uid,time]:= r
而total的大小> 0且total [0] + windowtime <=时间,则
而last [uid]的大小> 0和last [uid,0] + windowtime <=时间,
如果total的大小<g并且last [uid] <u的大小,则
返回金额
让我们看下面的实现以更好地理解-
from collections import defaultdict, deque class Solution: def solve(self, requests, u, g): last = defaultdict(deque) total = deque() windowtime = 60 requests.sort(key=lambda x: [x[1], x[0]]) amount = 0 for r in requests: uid, time = r while len(total) > 0 and total[0] + windowtime <= time: total.popleft() while len(last[uid]) > 0 and last[uid][0] + windowtime <= time: last[uid].popleft() if len(total) < g and len(last[uid]) < u: last[uid].append(time) total.append(time) amount += 1 return amount ob = Solution()requests = [[0, 1],[1, 2],[1,3]] u = 1 g = 5 print(ob.solve(requests, u, g))
[[0, 1],[1, 2],[1,3]], 1, 5
输出结果
2