151. Design Logger Message Printer

Asked in

Design Logger Message Printer
Design a logger system that processes a stream of messages along with their timestamps.

Each unique message can be printed at most once within any 10 second window. That means if a message is printed at timestamp t, the same message cannot be printed again before timestamp t + 10.

All incoming messages are provided in chronological order. It is also possible for multiple messages to share the same timestamp.

Class

MessageLogger

Methods

MessageLogger()

  • Initializes the logger system.

boolean canPrintMessage(int timestamp, String message)

  • Returns true if the given message is allowed to be printed at timestamp.
  • Returns false if the same message was printed in the last 10 seconds.
  • If a message is printed at timestamp t, then the next valid timestamp for that message becomes t + 10.

Rules

  • Messages are evaluated in non-decreasing order of timestamp.
  • Multiple messages may arrive at the same timestamp.
  • The decision for a message depends only on its own previous printed timestamps.

Constraints

  • 0 ≤ timestamp ≤ 10^9
  • 1 ≤ message.length ≤ 30
  • Timestamps are always provided in non-decreasing order.
  • At most 10^4 calls are made to canPrintMessage.

Examples

Example 1

MessageLogger logger = new MessageLogger();

logger.canPrintMessage(timestamp = 1, message = "foo") returns true
  • The message "foo" has not been printed before.
  • The next valid timestamp for "foo" becomes 11.
logger.canPrintMessage(timestamp = 2, message = "bar") returns true
  • The message "bar" is new.
  • The next valid timestamp for "bar" becomes 12.
logger.canPrintMessage(timestamp = 3, message = "foo") returns false
  • 3 < 11, so "foo" is still restricted.
logger.canPrintMessage(timestamp = 8, message = "bar") returns false
  • 8 < 12, so "bar" cannot be printed yet.
logger.canPrintMessage(timestamp = 10, message = "foo") returns false
  • 10 < 11, so "foo" is still blocked.
logger.canPrintMessage(timestamp = 11, message = "foo") returns true
  • 11 ≥ 11, so "foo" can be printed again.
  • The next valid timestamp becomes 21.

Example 2

MessageLogger logger = new MessageLogger();

logger.canPrintMessage(timestamp = 5, message = "alpha") returns true
  • First occurrence of "alpha".
logger.canPrintMessage(timestamp = 5, message = "beta") returns true
  • Different message, evaluated independently.
logger.canPrintMessage(timestamp = 14, message = "alpha") returns false
  • The next valid timestamp for "alpha" is 15.
logger.canPrintMessage(timestamp = 15, message = "alpha") returns true
  • 15 meets the required delay.




Please use Laptop/Desktop or any other large screen to add/edit code.