1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Logger { private Deque<Pair<Integer, String>> q; private Set<String> occurred; private String emptyString;
public Logger() { q = new ArrayDeque<>(); occurred = new HashSet<>(); emptyString = ""; }
public boolean shouldPrintMessage(int timestamp, String message) { int expirationTime = timestamp - 10; while (!q.isEmpty() && q.peek().getKey() <= expirationTime) { occurred.remove(q.poll().getValue()); } if (occurred.contains(message)) { return false; } else { q.offer(new Pair<>(timestamp, message)); occurred.add(message); return true; } } }
|
这个是用queue记录目前print过但还没超时的message, 然后Set可以让我们快速知道没超时的message中是否有我们想要print的. 这道题需要注意的是, 比如1时刻来个foo, 那么5时刻来的foo不会被print, 当11时刻来的时候, 我们不会因为上一次foo出现的时刻是5时刻而不print而是看上一次print的时候是什么时候, 那是1时刻, 因此我们此时可以print. 因此当我们print完之后, 我们才在set和queue中记录.
时间复杂度: O(n)
空间复杂度: O(n)