[LeetCode] Design Log Storage System

635. Design Log Storage System

You are given several logs, where 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.

Implement the LogSystem class:

  • LogSystem() Initializes the LogSystem object.
  • void put(int id, string timestamp) Stores the given log (id, timestamp) in your storage system.
  • int[] retrieve(string start, string end, string granularity) Returns the IDs of the logs whose timestamps are within the range from start to end inclusive. start and end all have the same format as timestamp, and granularity means how precise the range should be (i.e. to the exact Day, Minute, etc.). For example, start = “2017:01:01:23:59:59”, end = “2017:01:02:23:59:59”, and granularity = “Day” means that we need to find the logs within the inclusive range from Jan. 1st 2017 to Jan. 2nd 2017, and the Hour, Minute, and Second for each log entry can be ignored.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class LogSystem {
string parseMin(string time, string g) {
if(g == "Year")
return time.substr(0,5) + "00:00:00:00:00";
if(g == "Month")
return time.substr(0,8) + "00:00:00:00";
if(g == "Day")
return time.substr(0,11) + "00:00:00";
if(g == "Hour")
return time.substr(0,14) + "00:00";
if(g == "Minute")
return time.substr(0,17) + "00";
return time;
}

string parseMax(string time, string g) {
if(g == "Year")
return time.substr(0,5) + "12:31:23:59:59";
if(g == "Month")
return time.substr(0,8) + "31:23:59:59";
if(g == "Day")
return time.substr(0,11) + "23:59:59";
if(g == "Hour")
return time.substr(0,14) + "59:59";
if(g == "Minute")
return time.substr(0,17) + "59";
return time;
}
public:
LogSystem() {}
map<string, int> logs;

void put(int id, string timestamp) {
logs[timestamp] = id;
}

vector<int> retrieve(string start, string end, string granularity) {
string st = parseMin(start, granularity), ed = parseMax(end, granularity);
auto be = logs.lower_bound(st);
auto fin = logs.upper_bound(ed);
vector<int> res;
for(; be != fin; be++) {
res.push_back(be->second);
}
return res;
}
};

/**
* Your LogSystem object will be instantiated and called as such:
* LogSystem* obj = new LogSystem();
* obj->put(id,timestamp);
* vector<int> param_2 = obj->retrieve(start,end,granularity);
*/
Author: Song Hayoung
Link: https://songhayoung.github.io/2022/02/21/PS/LeetCode/design-log-storage-system/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.