天天看點

LeetCode-Python-359. 日志速率限制器

請你設計一個日志系統,可以流式接收日志以及它的時間戳。

該日志會被列印出來,需要滿足一個條件:當且僅當日志内容 在過去的 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;

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/problems/logger-rate-limiter

著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

思路:

用哈希表記錄字元串和它到達時刻的關系,key是時刻, val是字元串。

當一個新的字元串到達時,先判斷一下過去十秒内有沒有這個字元串,如果有,則說明不能列印,應當傳回False。

如果沒有,則表示可以列印,記錄到哈希表後傳回True。

class Logger(object):

    def __init__(self):
        """
        Initialize your data structure here.
        """
        from collections import defaultdict
        self.record = defaultdict(set)
        

    def shouldPrintMessage(self, timestamp, message):
        """
        Returns true if the message should be printed in the given timestamp, otherwise returns false.
        If this method returns false, the message will not be printed.
        The timestamp is in seconds granularity.
        :type timestamp: int
        :type message: str
        :rtype: bool
        """
        
        for i in range(timestamp - 9, timestamp + 1):
            if message in self.record[i]:
                return False
        self.record[timestamp].add(message)
        return True