题目地址:
https://leetcode.com/problems/logger-rate-limiter/
要求设计一个Logger类,能判断一个message是否应该打印。一个message应该被打印当且仅当过去 10 10 10秒内其未被打印。
思路是队列 + 哈希表。哈希表记录过去 10 10 10秒内被打印过的信息,队列记录过去 10 10 10秒来过的信息。遇到一个新信息的时候,先把队列里过期的信息都删掉,并且也从哈希表里删掉,然后看一下哈希表里是否存了新来的信息,如果存了,说明 10 10 10秒内其被打印过,则不能输出;否则将其加入哈希表和队列并可以输出。代码如下:
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
public class Logger {
class Pair {
int time;
String mes;
public Pair(int time, String mes) {
this.time = time;
this.mes = mes;
}
}
private Queue<Pair> queue;
private Set<String> set;
/**
* Initialize your data structure here.
*/
public Logger() {
queue = new LinkedList<>();
set = new HashSet<>();
}
/**
* Returns true if the message should be printed in the given timestamp, otherwise returns false.
* If this method returns false, the message will not be printed.
* The timestamp is in seconds granularity.
*/
public boolean shouldPrintMessage(int timestamp, String message) {
// 把10秒之前的信息都出队
while (!queue.isEmpty()) {
Pair head = queue.peek();
if (timestamp - head.time >= 10) {
queue.poll();
set.remove(head.mes);
} else {
break;
}
}
if (!set.contains(message)) {
queue.offer(new Pair(timestamp, message));
set.add(message);
return true;
}
return false;
}
}
判断的时间复杂度 O ( n ) O(n) O(n),空间 O ( n ) O(n) O(n)。