[LeetCode] Design Log Storage System 設計日誌存儲系統

 

You are given several logs that each log contains a unique id and timestamp. Timestamp is a string that has the following format: Year:Month:Day:Hour:Minute:Second, for example, 2017:01:01:23:59:59. All domains are zero-padded decimal numbers.html

Design a log storage system to implement the following functions:java

void Put(int id, string timestamp): Given a log's unique id and timestamp, store the log in your storage system.數組

 

int[] Retrieve(String start, String end, String granularity): Return the id of logs whose timestamps are within the range from start to end. Start and end all have the same format as timestamp. However, granularity means the time level for consideration. For example, start = "2017:01:01:23:59:59", end = "2017:01:02:23:59:59", granularity = "Day", it means that we need to find the logs within the range from Jan. 1st 2017 to Jan. 2nd 2017.數據結構

Example 1:dom

put(1, "2017:01:01:23:59:59");
put(2, "2017:01:01:22:59:59");
put(3, "2016:01:01:00:00:00");
retrieve("2016:01:01:01:01:01","2017:01:01:23:00:00","Year"); // return [1,2,3], because you need to return all logs within 2016 and 2017.
retrieve("2016:01:01:01:01:01","2017:01:01:23:00:00","Hour"); // return [1,2], because you need to return all logs start from 2016:01:01:01 to 2017:01:01:23, where log 3 is left outside the range.

 

Note:ide

  1. There will be at most 300 operations of Put or Retrieve.
  2. Year ranges from [2000,2017]. Hour ranges from [00,23].
  3. Output for Retrieve has no order required.

 

這道題讓咱們設計一個日誌存儲系統,給了日誌的生成時間和日誌編號,日誌的生成時間是精確到秒的,而後咱們主要須要完成一個retrieve函數,這個函數會給一個起始時間,結束時間,還有一個granularity精確度,能夠精確到任意的年月日時分秒,能夠分析下題目中的例子,應該不難理解。咱們首先須要一個數據結構來存儲每一個日誌的編號和時間戳,那麼這裏咱們就用一個數組,裏面存pair,這樣就能存下日誌的數據了。而後因爲咱們要用到精確度,因此咱們用一個units數組來列出全部可能的精確度了。下面就是本題的難點了,如何能正確的在時間範圍內取出日誌。因爲精確度的存在,好比精確度是Day,那麼咱們就不關心後面的時分秒是多少了,只須要比到天就好了。判斷是否在給定的時間範圍內的方法也很簡單,看其是否大於起始時間,且小於結束時間,咱們甚至能夠直接用字符串相比較,不用換成秒啥的太麻煩。因此咱們能夠根據時間精度肯定要比的子字符串的位置,而後直接相比就好了。因此咱們須要一個indices數組,來對應咱們的units數組,記錄下每一個時間精度下取出的字符的個數。而後在retrieve函數中,遍歷全部的日誌,快速的根據時間精度取出對應的時間戳而且和起始結束時間相比,在其之間的就把序號加入結果res便可,參見代碼以下:函數

 

class LogSystem {
public:
    LogSystem() {
        units = {"Year", "Month", "Day", "Hour", "Minute", "Second"};
        indices = {4, 7, 10, 13, 16, 19}; 
    }
    
    void put(int id, string timestamp) {
        timestamps.push_back({id, timestamp});
    }
    
    vector<int> retrieve(string s, string e, string gra) {
        vector<int> res;
        int idx = indices[find(units.begin(), units.end(), gra) - units.begin()];
        for (auto p : timestamps) {
            string t = p.second;
            if (t.substr(0, idx).compare(s.substr(0, idx)) >= 0 && t.substr(0, idx).compare(e.substr(0, idx)) <= 0) {
                res.push_back(p.first);
            }
        }
        return res;
    }

private:
    vector<pair<int, string>> timestamps;
    vector<string> units;
    vector<int> indices;
};

 

相似題目:post

Design In-Memory File Systemui

 

參考資料:url

https://discuss.leetcode.com/topic/94449/concise-java-solution

 

LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索