933. 最近的请求次数

题目

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

它只有一个方法:ping(int t),其中 t 代表以毫秒为单位的某个时间。

返回从 3000 毫秒前到现在的 ping 数。

任何处于 [t - 3000, t] 时间范围之内的 ping 都将会被计算在内,包括当前(指 t 时刻)的 ping。

保证每次对 ping 的调用都使用比之前更大的 t 值

示例 1:

1
2
输入:inputs = ["RecentCounter","ping","ping","ping","ping"], inputs = [[],[1],[100],[3001],[3002]]
输出:[null,1,2,3,3]

提示:

  • 每个测试用例最多调用 10000 次 ping。
  • 每个测试用例会使用严格递增的 t 值来调用 ping。
  • 每次调用 ping 都有 1 <= t <= 10^9。

解法

解法一:

JAVA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class RecentCounter {
List<Integer> list;
public RecentCounter() {
list = new ArrayList<>();
}

public int ping(int t) {
list.add(t);
int count = 0;
for (int i = list.size() - 1;i>= 0;i--) {
if (t - list.get(i) <= 3000) {
count++;
} else {
break;
}
}
return count;
}
}

解法二:

我们只会考虑最近 3000 毫秒到现在的 ping 数,因此我们可以使用队列存储这些 ping 的记录。当收到一个时间 t 的 ping 时,我们将它加入队列,并且将所有在时间 t - 3000 之前的 ping 移出队列。

1
2
3
4
5
6
7
8
9
10
11
12
13
class RecentCounter {
Queue<Integer> q;
public RecentCounter() {
q = new LinkedList();
}

public int ping(int t) {
q.add(t);
while (q.peek() < t - 3000)
q.poll();
return q.size();
}
}
0%