一、题目描述
写一个
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() | 返回队列中元素个数 |