前言
Weekly Contest 109的第一题 最近的请求次数:
写一个
RecentCounter
类来计算最近的请求。它只有一个方法:
ping(int t)
,其中t
代表以毫秒为单位的某个时间。返回从
3000
毫秒前到现在的ping
数。任何处于
[t - 3000, t]
时间范围之内的ping
都将会被计算在内,包括当前(指t
时刻)的ping
。保证每次对
ping
的调用都使用比之前更大的t
值。示例:
输入: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
。
解题思路
本题其实并不复杂,但是我在实现时由于思考的方向错了,导致了花费大量时间去完成这个题目。
一开始我的思路是仿照LRU
算法,实现一个会移除超出有效范围[t - 3000, t]
的缓存。
但是随着不断的尝试后,发现其实只需要统计时有效的ping
即可。期间遇到过好几次执行超时的情况,所以需要优化统计有效ping
时的检索区间。
所以最终实现思路如下:
- 需要一个存储所有
ping
时间的数组list
和记录最小有效ping
时间的list
索引minIndex
- 每次
ping
就从minIndex
开始检索list
,直到遇到数组list
中的ping
时间item
有效(即item
在[t - 3000, t]
)则中断循环,否则(item<t-3000
)minIndex
自增。
实现代码
/**
* 933. 最近的请求次数
* @author RJH
* create at 2018/11/4
*/
public class RecentCounter {
/**
* 存储ping时间的List
*/
private List<Integer> list;
/**
* 最小有效ping时间的索引
*/
private int minIndex=0;
public RecentCounter() {
list=new LinkedList<>();
}
public int ping(int t) {
list.add(t);
for(int i=minIndex;i<list.size();i++){//从minIndex开始遍历List
Integer item=list.get(i);
if(item<t-3000){//判断最小的有效ping时间是否无效
++minIndex;
}else{
break;
}
}
//返回有效的元素个数
return list.size()-minIndex;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。