天天看點

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;

方法1:

主要思路:

(1)直覺的想,就是使用一個unordered_map将日志内容和時間戳映射出來,這樣再有相同的日志到來時,可以直接比較時間戳是否滿足要求即可;

class Logger {
public:
    unordered_map<string,int> mp;//存儲日志和時間戳的映射

    /** Initialize your data structure here. */
    Logger() {

    }
    
    /** 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. */
    bool shouldPrintMessage(int timestamp, string message) {
        if(mp.count(message)){//若日志之前出現過,則比較時間戳是否滿足要求
            if(timestamp-mp[message]<10){
                return false;
            }
            else{
                mp[message]=timestamp;
                return true;
            }
        }
        else{//若日志之前沒有出現過,則将日志插入映射,并傳回true
            mp[message]=timestamp;
            return true;
        }
    }
};

/**
 * Your Logger object will be instantiated and called as such:
 * Logger* obj = new Logger();
 * bool param_1 = obj->shouldPrintMessage(timestamp,message);
 */