Python程序:检查给定条件下将处理的请求数量
假设我们有一份请求列表,每个列表元素包含 [uid, time_sec] (uid是用户ID,time_sec是时间戳)。这表示用户ID为uid的用户在时间戳time_sec向网站发出了请求。我们还有两个值u和g,u表示在任何小于60秒的时间段内,给定uid允许的最大请求数,g表示在任何小于60秒的时间段内,全局允许的最大请求数。现在,如果我们想逐个处理每个请求并对其进行速率限制,如果多个用户同时发出请求,则将优先处理uid较小的请求,否则该请求将被丢弃。我们必须找到将成功处理的请求总数。
因此,如果输入类似于 requests = [[0, 1],[1, 2],[1,3]] u = 1 g = 5,则输出将为2,因为用户0和1可以在时间1和2发送请求,但用户1的第二个请求将不会被处理,因为一个用户在60秒内最多只能发送1个请求。
为了解决这个问题,我们将遵循以下步骤:
- last := 一个空的映射
- total := 一个空的双端队列
- windowtime := 60
- 根据时间对请求进行排序,如果时间相同,则根据uid进行排序
- amount := 0
- 对于requests中的每个r,执行以下操作:
- [uid, time] := r
- 当total的大小>0并且total[0] + windowtime <= time时,执行以下操作:
- 删除total的左侧元素
- 当last[uid]的大小>0并且last[uid, 0] + windowtime <= time时,执行以下操作:
- 删除last[uid]的左侧元素
- 如果total的大小< g并且last[uid]的大小< u,则:
- 将time插入last[uid]的末尾
- 将time插入total的末尾
- amount := amount + 1
- 返回amount
让我们来看下面的实现,以便更好地理解:
示例
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
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP