[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.

Design a log storage system to implement the following functions:

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:

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:

  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;
};

 

類似題目:

Design In-Memory File System

 

參考資料:

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

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM