使用Python检查满足给定条件将处理的请求数量的程序

使用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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程