news 2026/4/3 4:22:25

算法题 最近的请求次数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法题 最近的请求次数

933. 最近的请求次数

问题描述

写一个RecentCounter类来计算最近的请求次数。

实现RecentCounter类:

  • RecentCounter()初始化计数器,请求数为0。
  • int ping(int t)在时间t添加一个新的请求(t表示以毫秒为单位的时间),并返回过去3000 毫秒内(包括t时刻)发生的请求数。

保证每次调用ping时,t的值都比之前的值大。

示例

输入: ["RecentCounter","ping","ping","ping","ping"] [[],[1],[100],[3001],[3002]] 输出: [null,1,2,3,3] 解释: - ping(1) -> [1] -> 1个请求在[1-3000,1]范围内 - ping(100) -> [1,100] -> 2个请求在[100-3000,100]范围内 - ping(3001) -> [1,100,3001] -> 3个请求在[1,3001]范围内 - ping(3002) -> [1,100,3001,3002] -> 3个请求在[2,3002]范围内(1被排除)

算法思路

滑动窗口

  1. 使用队列存储所有请求的时间戳
  2. 每次调用ping(t)时:
    • 将当前时间t加入队列
    • 移除队列中所有不在[t-3000, t]范围内的旧请求
    • 返回队列的当前大小

代码实现

方法一:滑动窗口

importjava.util.Queue;importjava.util.LinkedList;classRecentCounter{privateQueue<Integer>requests;// 存储请求时间戳的队列privatestaticfinalintWINDOW_SIZE=3000;// 时间窗口大小/** * 构造函数:初始化RecentCounter */publicRecentCounter(){this.requests=newLinkedList<>();}/** * 在时间t添加请求,并返回过去3000毫秒内的请求数 * * @param t 请求时间戳(毫秒) * @return 过去3000毫秒内的请求数 */publicintping(intt){// 添加当前请求requests.offer(t);// 移除所有过期的请求(时间戳 < t - 3000)while(!requests.isEmpty()&&requests.peek()<t-WINDOW_SIZE){requests.poll();}// 返回当前窗口内的请求数returnrequests.size();}}

方法二:双端队列

importjava.util.Deque;importjava.util.ArrayDeque;classRecentCounter{privateDeque<Integer>requests;privatestaticfinalintWINDOW_SIZE=3000;publicRecentCounter(){this.requests=newArrayDeque<>();}publicintping(intt){requests.addLast(t);// 移除过期请求while(!requests.isEmpty()&&requests.getFirst()<t-WINDOW_SIZE){requests.removeFirst();}returnrequests.size();}}

算法分析

  • 时间复杂度
    • 单次ping操作:均摊 O(1)
    • 虽然有while循环,每个请求最多被加入和移除一次
  • 空间复杂度:O(W),W 是时间窗口内的最大请求数

算法过程

输入:[1,100,3001,3002]

  1. ping(1)

    • 队列:[1]
    • 有效范围:[1-3000, 1] = [-2999, 1]
    • 所有请求都有效,返回1
  2. ping(100)

    • 队列:[1, 100]
    • 有效范围:[100-3000, 100] = [-2900, 100]
    • 所有请求都有效,返回2
  3. ping(3001)

    • 队列:[1, 100, 3001]
    • 有效范围:[3001-3000, 3001] = [1, 3001]
    • 所有请求都有效(1 >= 1),返回3
  4. ping(3002)

    • 队列:[1, 100, 3001, 3002]
    • 有效范围:[3002-3000, 3002] = [2, 3002]
    • 请求1过期(1 < 2),移除后队列:[100, 3001, 3002]
    • 返回3

测试用例

publicstaticvoidmain(String[]args){// 测试用例1:标准示例RecentCounterrc1=newRecentCounter();System.out.println("Test 1:");System.out.println(rc1.ping(1));// 1System.out.println(rc1.ping(100));// 2System.out.println(rc1.ping(3001));// 3System.out.println(rc1.ping(3002));// 3// 测试用例2:密集请求RecentCounterrc2=newRecentCounter();System.out.println("\nTest 2:");for(inti=1;i<=5;i++){System.out.println(rc2.ping(i));// 1,2,3,4,5}// 测试用例3:稀疏请求(间隔很大)RecentCounterrc3=newRecentCounter();System.out.println("\nTest 3:");System.out.println(rc3.ping(1));// 1System.out.println(rc3.ping(4000));// 1 (1已过期)System.out.println(rc3.ping(8000));// 1 (4000已过期)// 测试用例4:边界情况RecentCounterrc4=newRecentCounter();System.out.println("\nTest 4:");System.out.println(rc4.ping(3000));// 1System.out.println(rc4.ping(6000));// 1 (3000刚好过期: 6000-3000=3000, 3000<3000)// 测试用例5:连续请求在边界RecentCounterrc5=newRecentCounter();System.out.println("\nTest 5:");System.out.println(rc5.ping(1));// 1System.out.println(rc5.ping(3001));// 2 (1仍在范围内: 3001-3000=1, 1>=1)System.out.println(rc5.ping(3002));// 2 (1过期: 3002-3000=2, 1<2)}

关键点

  1. 滑动窗口

    • 维护一个时间窗口[t-3000, t]
    • 动态添加新元素,移除过期元素
    • 队列大小就是窗口内的元素数量
  2. 单调性

    • 由于t严格递增,队列中的时间戳也是递增的
    • 过期元素总是集中在队列头部
    • 不需要检查队列中间或尾部的元素

常见问题

  1. 为什么不用数组或列表?
    • 数组/列表删除头部元素需要O(n)时间
    • 队列的poll()操作是O(1)的
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/21 0:56:40

DouPHPCms靶场代码审计之代码执行

目录 漏洞复现前的准备工作&#xff1a; 一、代码执行漏洞简介 二、PHP双引号的高级用法 寻找存在代码执行漏洞的点 一、寻找可利用的unlink函数 第6个文件的第56行&#xff1a; 去网站看看对应功能点&#xff1a; 接下来&#xff0c;我们在网站删除Logo的时候抓包看看…

作者头像 李华
网站建设 2026/4/1 0:33:24

强烈安利!8个AI论文网站测评:本科生开题报告全攻略

强烈安利&#xff01;8个AI论文网站测评&#xff1a;本科生开题报告全攻略 为什么需要这份AI论文网站测评&#xff1f; 对于大多数本科生而言&#xff0c;撰写开题报告是科研旅程中的第一道门槛。面对海量文献、复杂的格式要求以及对AI工具的不熟悉&#xff0c;许多同学感到无从…

作者头像 李华
网站建设 2026/3/27 11:16:24

核心内容总结:系统维护是信息系统运维的关键环节,强调代码维护需由专门小组管理,通过书面流程推进变更

核心内容总结&#xff1a;系统维护是信息系统运维的关键环节&#xff0c;强调代码维护需由专门小组管理&#xff0c;通过书面流程推进变更&#xff0c;并在业务端设专人对接&#xff0c;以明确责任、降低出错风险。系统修改影响广泛&#xff0c;必须遵循“计划先行、分步实施”…

作者头像 李华
网站建设 2026/3/26 19:49:05

从巨人的肩膀起飞:大模型蒸馏(LLM Distillation)完全指南

在当今的大模型&#xff08;LLM&#xff09;时代&#xff0c;我们拥有了像 GPT-4、DeepSeek-V3、Claude 3.5 这样能力惊人但体积庞大的“巨无霸”模型。然而&#xff0c;在实际落地中&#xff0c;昂贵的推理成本、巨大的显存占用和高延迟往往让人望而却步。 大模型蒸馏&#xf…

作者头像 李华
网站建设 2026/3/27 10:20:24

导师推荐9个AI论文写作软件,助你轻松搞定本科生毕业论文!

导师推荐9个AI论文写作软件&#xff0c;助你轻松搞定本科生毕业论文&#xff01; AI 工具助力论文写作&#xff0c;轻松应对学术挑战 随着人工智能技术的不断发展&#xff0c;越来越多的本科生开始借助 AI 工具来提升论文写作的效率与质量。在当前的学术环境中&#xff0c;AIGC…

作者头像 李华