面试算法42:最近请求次数

题目

请实现如下类型RecentCounter,它是统计过去3000ms内的请求次数的计数器。该类型的构造函数RecentCounter初始化计数器,请求数初始化为0;函数ping(int t)在时间t添加一个新请求(t表示以毫秒为单位的时间),并返回过去3000ms内(时间范围为t-3000,t)发生的所有请求数。假设每次调用函数ping的参数t都比之前调用的参数值大。

java 复制代码
public class RecentCounter {
    private Queue<Integer> times;
    private int windowsSize;
}

例如,在初始化一个RecentCounter计数器之后,ping(1)的返回值是1,因为时间范围-2999,1只有1个请求;ping(10)的返回值是2,因为时间范围-2990,10有2个请求;ping(3001)的返回值是3,因为时间范围1,3001有3个请求;ping(3002)的返回值是3,因为时间范围2,3002有3个请求,发生在时间1的请求已经不在这个时间范围内。

分析

为了解决这个问题,首先需要考虑的是用什么数据结构来记录每次请求的时间。在ping(1)、ping(10)、ping(3001)发生时,先后将时间1、10、3001记录到一个数据容器中。接下来发生了ping(3002),此时时间1已经超出当前的时间范围,时间1发生的请求不被计数,因此时间1需要从数据容器中删除。需要注意的是,在1、10、3001、3002这几个时间中,时间1是最先存入数据容器中的,它最先被删除,这符合"先入先出"的规律,因此可以考虑用队列实现这个数据容器。

java 复制代码
public class RecentCounter {
    private Queue<Integer> times;
    private int windowsSize;

    public static void main(String[] args) {
        RecentCounter recentCounter = new RecentCounter();
        System.out.println(recentCounter.ping(1));
        System.out.println(recentCounter.ping(10));
        System.out.println(recentCounter.ping(3001));
        System.out.println(recentCounter.ping(3002));
    }

    public RecentCounter() {
        times = new LinkedList<>();
        windowsSize = 3000;
    }

    public int ping(int t) {
        times.offer(t);
        while (times.peek() + windowsSize < t) {
            times.poll();
        }

        return times.size();
    }
}
相关推荐
白狐_7982 分钟前
408 数据结构|完全二叉树两道典型题:第 6 层叶结点数与叶结点总数
数据结构·算法
lucas_AI3 分钟前
喂张白纸也能吐出证件号?文档 MLLM 的"关系级泄露"被测出来了
人工智能·算法·掘金技术征文
jason成都5 分钟前
ignav-next|Java 层封装 GNSS/INS 组合导航框架,隔离 RTKLIB 与 INS 内核,双模块独立演进、最小侵入
java·开发语言
抓不住时间的沙6 分钟前
butterfly主题美化,打造属于自己的个性博客
java·开发语言·前端·javascript·node.js·github
众人皆醒我独醉12 分钟前
GPU 集群 IaC:Terraform + Ansible 部署自动化
面试·ansible·gpu
Zane199416 分钟前
从一个发短信的类到多态调用:封装、继承、多态到底是怎么长出来的
java·后端
手写码匠17 分钟前
华为云Flexus+DeepSeek征文|Dify 多 Agent 灰度发布实战:让每一次变更都“小步快跑、随时可回滚“
人工智能·深度学习·算法·aigc
MarkHD20 分钟前
Stable Diffusion入门第19-20天:保存与分享你的工作流——第一阶段收官,从“能用”到“可复用”
java·开发语言·stable diffusion
爱敲键盘的猴子23 分钟前
Spring MVC 详解(一):全注解开发与请求响应处理
java·spring·mvc
counting money32 分钟前
SpringBoot 项目创建(IDEA不全,还需要修改)
java·spring boot·spring·maven