leetcode359. 日誌速率限制器

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

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

思路:我們可以用一個雙端隊列維護所有出現過的日誌,然後去掉那些過期的,保證隊列裏是十秒內的就ok,但是費時間。

我的思路是一個map記錄最後一次出現的時間,新日誌請求去查一下map即可,這樣做的好處是速度快,壞處是map的空間可能會無限擴張,這時你可以定時或者定量去刪掉過期的記錄(我並沒有寫這個邏輯)

class Logger {
  private HashMap<String, Integer> msgDict;

  /** Initialize your data structure here. */
  public Logger() {
    msgDict = new HashMap<String, Integer>();
  }

  /**
   * Returns true if the message should be printed in the given timestamp, otherwise returns false.
   */
  public boolean shouldPrintMessage(int timestamp, String message) {
    //沒出現過
    if (!msgDict.containsKey(message) || timestamp - msgDict.get(message) >= 10) {
      //未出現,或時間差超過十秒
      msgDict.put(message, timestamp);
      return true;
    } else {
      //十秒內出現過
      return false;
    }
  }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章