[Leetcode] 359 Logger Rate limit
class Logger:
def __init__(self):
# key=message(str), value=timestamp_last_sent(int)
self.msg_sent = {}
self.cap = 10
def shouldPrintMessage(self, timestamp: int, message: str) -> bool:
if message not in self.msg_sent:
self.msg_sent[message] = timestamp
return True
else:
# check if within window
latest_ts = self.msg_sent[message]
if timestamp - latest_ts < self.cap:
return False
else:
self.msg_sent[message] = timestamp
return True
接下来重要讨论下可能的follow-up
follow-up 1, 原题中限制的是 limit_per_message, 如果是我们限制 limit_per_user_per_message, 即相同用户,相同消息,我们有一个limit, 如何实现呢?
比较直接的方法就是把这个多重限制转化成key
# before
# dict[message(str), timestamp]
# e.g {"foo": 1001}
self.msg_sent = {}
# after
# dict[rate_limit_key(str), timestamp]
# e.g {"user_1::foo": 1001}
self.msg_sent = {}
key = user_id + "::" + message
follow-up 2 如果限制的不是说每X秒只能发一个,而是每X秒最多发Y个相同message, 怎么改呢?
那么这个时候也记录最后一次消息发送的时间就不够了,我们需要记录的是最近发送的所有消息
# before
# dict[message(str), timestamp]
# e.g {"foo": 1001}
self.msg_sent = {}
# after
# dict[rate_limit_key(str), queue[timestamp]]
# e.g {"user_1::foo": [1001, 1002, 1005, 1010]}
self.msg_sent = {}
然后每次先把超过时间窗口的排除,然后看是否已经达到limit