Implement a web logger, which provide two methods:
hit(timestamp)
, record a hit at given timestamp.get_hit_count_in_last_5_minutes(timestamp)
, get hit count in last 5 minutes.
the two methods will be called with non-descending timestamp (in sec).
Example
Example 1:
Input:
hit(1);
hit(2);
get_hit_count_in_last_5_minutes(3);
hit(300);
get_hit_count_in_last_5_minutes(300);
get_hit_count_in_last_5_minutes(301);
Output:
2
3
2
Example 2:
Input:
hit(1)
hit(1)
hit(1)
hit(2)
get_hit_count_in_last_5_minutes(3)
hit(300)
get_hit_count_in_last_5_minutes(300)
get_hit_count_in_last_5_minutes(301)
get_hit_count_in_last_5_minutes(302)
get_hit_count_in_last_5_minutes(900)
get_hit_count_in_last_5_minutes(900)
Output:
4
5
2
1
0
0
Notice
The unit of timestamp
is seconds.
The call to the function is in chronological order, that is to say, timestamp
is in ascending order.
思路:前面要弹出去,后面要加进来,用deque就可以解决;注意deque = new ArrayDeque<Integer>(); peekFirst(), pollFirst();
这题其实用queue做也可以,queue的poll, peek,offer 也可以做;
public class WebLogger {
private Deque<Integer> deque;
public WebLogger() {
deque = new ArrayDeque<Integer>();
}
/*
* @param timestamp: An integer
* @return: nothing
*/
public void hit(int timestamp) {
// 这里也可以维护一个300size的queue;
while(!deque.isEmpty() && timestamp - deque.peekFirst() >= 300) {
deque.pollFirst();
}
deque.offer(timestamp);
}
/*
* @param timestamp: An integer
* @return: An integer
*/
public int get_hit_count_in_last_5_minutes(int timestamp) {
// 注意get_hit_count的时候,并没有往queue里面加东西;
while(!deque.isEmpty() && timestamp - deque.peekFirst() >= 300) {
deque.pollFirst();
}
return deque.size();
}
}