一【题目类别】
二【题目难度】
三【题目编号】
四【题目描述】
- 写一个 RecentCounter 类来计算特定时间范围内最近的请求。
- 请你实现 RecentCounter 类:
- RecentCounter() 初始化计数器,请求数为 0 。
- int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
- 保证 每次对 ping 的调用都使用比之前更大的 t 值。
五【题目示例】
- 示例:
输入:
[“RecentCounter”, “ping”, “ping”, “ping”, “ping”]
[[], [1], [100], [3001], [3002]]
输出:
[null, 1, 2, 3, 3]
解释:
RecentCounter recentCounter = new RecentCounter();
recentCounter.ping(1); // requests = [1],范围是 [-2999,1],返回 1
recentCounter.ping(100); // requests = [1, 100],范围是 [-2900,100],返回 2
recentCounter.ping(3001); // requests = [1, 100, 3001],范围是 [1,3001],返回 3
recentCounter.ping(3002); // requests = [1, 100, 3001, 3002],范围是 [2,3002],返回 3
六【题目提示】
-
1
<
=
t
<
=
1
0
9
1 <= t <= 10^9
1<=t<=109
-
保
证
每
次
对
p
i
n
g
调
用
所
使
用
的
t
值
都
严
格
递
增
保证每次对 ping 调用所使用的 t 值都 严格递增
保证每次对ping调用所使用的t值都严格递增
-
至
多
调
用
p
i
n
g
方
法
1
0
4
次
至多调用 ping 方法 10^4 次
至多调用ping方法104次
七【解题思路】
- 题目比较难理解,其实就是一个队列,我们只要[t-3000,t]这个区间的值,每次来新的值我们只需要区间向前移动即可(因为题目说t递增),所以区间前移之后,区间左端点的值就是最小的,将队列头中所有小于区间左端元素值的元素全都poll出去,然后队列长度即可
八【时间频度】
九【代码实现】
- Java语言版
package Queue;
import java.util.LinkedList;
import java.util.Queue;
public class p933_NumberOfRecentCalls {
private static Queue<Integer> queue;
public static void main(String[] args) {
RecentCounter();
int ping1 = ping(1);
int ping2 = ping(100);
int ping3 = ping(3001);
int ping4 = ping(3002);
System.out.println(ping1 + " " + ping2 + " " + ping3 + " " + ping4);
}
public static void RecentCounter() {
queue = new LinkedList<>();
}
public static int ping(int t) {
queue.offer(t);
while (queue.peek() < t - 3000) {
queue.poll();
}
return queue.size();
}
}
- C语言版
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 10000
typedef struct
{
int *data;
int front;
int rear;
}RecentCounter;
RecentCounter* recentCounterCreate()
{
RecentCounter* queue = (RecentCounter *)malloc(sizeof(RecentCounter));
queue->data = (int *)calloc(MAXSIZE, sizeof(int));
queue->front = 0;
queue->rear = 0;
return queue;
}
int recentCounterPing(RecentCounter* obj, int t)
{
obj->data[obj->rear++] = t;
while (obj->data[obj->front] < t - 3000)
{
obj->front++;
}
return obj->rear - obj->front;
}
void recentCounterFree(RecentCounter* obj)
{
free(obj->data);
free(obj);
}
int main(void)
{
}
十【提交结果】
- Java语言版
- C语言版