Design a logger system that receive stream of messages along with its timestamps, each message should be printed if and only if it is not printed in the last 10 seconds.
Given a message and a timestamp (in seconds granularity), return true if the message should be printed in the given timestamp, otherwise returns false.
It is possible that several messages arrive roughly at the same time.
Example:
Logger logger = new Logger(); // logging string "foo" at timestamp 1 logger.shouldPrintMessage(1, "foo"); returns true; // logging string "bar" at timestamp 2 logger.shouldPrintMessage(2,"bar"); returns true; // logging string "foo" at timestamp 3 logger.shouldPrintMessage(3,"foo"); returns false; // logging string "bar" at timestamp 8 logger.shouldPrintMessage(8,"bar"); returns false; // logging string "foo" at timestamp 10 logger.shouldPrintMessage(10,"foo"); returns false; // logging string "foo" at timestamp 11 logger.shouldPrintMessage(11,"foo"); returns true;
Credits:
Special thanks to @memoryless for adding this problem and creating all test cases.
這道題讓我們設計一個記錄系統每次接受信息並保存時間戳,然后讓我們打印出該消息,前提是最近10秒內沒有打印出這個消息。這不是一道難題,我們可以用哈希表來做,建立消息和時間戳之間的映射,如果某個消息不再哈希表表,我們建立其和時間戳的映射,並返回true。如果應經在哈希表里了,我們看當前時間戳是否比哈希表中保存的時間戳大10,如果是,更新哈希表,並返回true,反之返回false,參見代碼如下:
解法一:
class Logger { public: Logger() {} bool shouldPrintMessage(int timestamp, string message) { if (!m.count(message)) { m[message] = timestamp; return true; } if (timestamp - m[message] >= 10) { m[message] = timestamp; return true; } return false; } private: unordered_map<string, int> m; };
我們還可以寫的更精簡一些,如下所示:
解法二:
class Logger { public: Logger() {} bool shouldPrintMessage(int timestamp, string message) { if (timestamp < m[message]) return false; m[message] = timestamp + 10; return true; } private: unordered_map<string, int> m; };
參考資料:
https://leetcode.com/discuss/108703/short-c-java-python-bit-different
