使用Python检查满足给定条件将处理的请求数量的程序
假设我们有一个请求列表,其中每个列表包含[uid,time_sec]这样的元素(uid是用户ID,time_sec是时间戳)。这表示在时间戳time_sec上,其ID为uid的用户已向网站发出请求。我们还有两个值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
- 如果帧的2个请求具有相同的uid,则基于时间对请求进行排序
- amount:0
- 对于请求中的每个r,执行以下操作
- [uid,time]:= r
- while total大小> 0 and total[0] + windowtime <= time时执行以下操作
- 删除total的左侧项
- 当last [uid]大小> 0 and last [uid,0] + windowtime <= time时执行以下操作
- 从last [uid]删除左侧项
- if total大小< g朗月数且last [uid]大小< u,则
- 在last [uid]的末尾插入时间
- 在total的末尾插入时间
- amount:=amount+1
- 返回amount
让我们看以下实现以更好地理解-
更多Python相关文章,请阅读:Python 教程
示例
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