933、最近的请求数量——queue(队列)

本文详细介绍了如何设计一个RecentCounter类,用于计算过去3000毫秒内的有效请求次数。通过使用队列或数组的数据结构,当接收到新请求时,删除早于当前时间减去3000毫秒的所有请求,然后返回队列或数组中剩余的请求数量。这种方法展示了数据结构在解决实际问题中的应用,特别是对于实时性和时间窗口计算的需求。
摘要由CSDN通过智能技术生成

一、题目描述

933、最近的请求次数

写一个 RecentCounter 类来计算特定时间范围内最近的请求。
请你实现 RecentCounter 类:
    ● RecentCounter() 初始化计数器,请求数为 0
    ● int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
保证 每次对 ping 的调用都使用比之前更大的 t 值。

二、题目分析

    (1)明确题目意思,以当前输入的时间为结点,往前的 3000 毫秒之内的所有请求都是 有效的请求
    (2)可以利用队列实现,把当前时间点存入队列。队列中的元素若 不符合有效的请求 则出队,最后统计队列中元素的数量;
    (3)也可以用数组来实现类似队列的操作。

三、代码实现

使用 queue

class RecentCounter {
private:
    queue<int> q;
public:
    RecentCounter() {}
    
    int ping(int t) {
        q.push(t);
        while(q.front() < t - 3000){
            q.pop();
        }
        return q.size();
    }
};

/**
 * Your RecentCounter object will be instantiated and called as such:
 * RecentCounter* obj = new RecentCounter();
 * int param_1 = obj->ping(t);
 */

利用数组代替 queue 使用:

class RecentCounter {
private:
    int left, right, times[10005]; 
public:
    RecentCounter() {
        left = 0;
        right = 0;
    }
    int ping(int t){
        times[right++] = t;
        while(times[left] < t - 3000){
            ++ left;
        }
        return right - left;
    }

};

/**
 * Your RecentCounter object will be instantiated and called as such:
 * RecentCounter* obj = new RecentCounter();
 * int param_1 = obj->ping(t);
 */

四、总结

    (1)拿到题目一定要搞清楚题目的逻辑关系,否则解题一定是稀里糊涂的;
    (2)利用数组实现一些数据结构的方法要掌握,自己解题的时候不一定手写数据结构,但一定可以加深对相应数据结构的理解。对于熟练使用 C 语言的程序员来说,多是手写这种数据结构。掌握这种方法可以更加方便我们阅读部分源码;
    (3)给一个 vector ,实现 元素出现次数 对应,肯定很容易想到用 map 来实现,有没有想过利用数组也可以实现啊?具体说来就是,下标 是表示的元素,下标对应的 数组的值 是出现的次数;
    (4)既然今天的每日一题用到了 队列 的知识,那就简单回顾一下吧:
队列是一种数据结构,基本规则是 先入先出 ,就像我们在食堂排队打饭一样,新来的人从队伍末尾加入队伍,排在队头的人先打饭。具体的一些操作如下表格所示:

queue操作解释
q.pop()队首元素出队
q.front()返回队首元素
q.back()返回队尾元素
q.push()在队列末尾创建一个元素
q.empty()判断队列是否为空
q.size()返回队列中元素个数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wang_nn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值