請你設計一個日誌系統,可以流式接收日誌以及它的時間戳。
該日誌會被打印出來,需要滿足一個條件:當且僅當日誌內容 在過去的 10 秒鐘內沒有被打印過。
給你一條日誌的內容和它的時間戳(粒度爲秒級),如果這條日誌在給定的時間戳應該被打印出來,則返回 true,否則請返回 false。
要注意的是,可能會有多條日誌在同一時間被系統接收。
示例:
Logger logger = new Logger();
// 日誌內容 "foo" 在時刻 1 到達系統
logger.shouldPrintMessage(1, "foo"); returns true;
// 日誌內容 "bar" 在時刻 2 到達系統
logger.shouldPrintMessage(2,"bar"); returns true;
// 日誌內容 "foo" 在時刻 3 到達系統
logger.shouldPrintMessage(3,"foo"); returns false;
// 日誌內容 "bar" 在時刻 8 到達系統
logger.shouldPrintMessage(8,"bar"); returns false;
// 日誌內容 "foo" 在時刻 10 到達系統
logger.shouldPrintMessage(10,"foo"); returns false;
// 日誌內容 "foo" 在時刻 11 到達系統
logger.shouldPrintMessage(11,"foo"); returns true;
思路:我們可以用一個雙端隊列維護所有出現過的日誌,然後去掉那些過期的,保證隊列裏是十秒內的就ok,但是費時間。
我的思路是一個map記錄最後一次出現的時間,新日誌請求去查一下map即可,這樣做的好處是速度快,壞處是map的空間可能會無限擴張,這時你可以定時或者定量去刪掉過期的記錄(我並沒有寫這個邏輯)
class Logger {
private HashMap<String, Integer> msgDict;
/** Initialize your data structure here. */
public Logger() {
msgDict = new HashMap<String, Integer>();
}
/**
* Returns true if the message should be printed in the given timestamp, otherwise returns false.
*/
public boolean shouldPrintMessage(int timestamp, String message) {
//沒出現過
if (!msgDict.containsKey(message) || timestamp - msgDict.get(message) >= 10) {
//未出現,或時間差超過十秒
msgDict.put(message, timestamp);
return true;
} else {
//十秒內出現過
return false;
}
}
}