返回介绍

solution / 0600-0699 / 0635.Design Log Storage System / README_EN

发布于 2024-06-17 01:03:36 字数 7605 浏览 0 评论 0 收藏 0

635. Design Log Storage System

中文文档

Description

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.

 

Example 1:

Input
["LogSystem", "put", "put", "put", "retrieve", "retrieve"]
[[], [1, "2017:01:01:23:59:59"], [2, "2017:01:01:22:59:59"], [3, "2016:01:01:00:00:00"], ["2016:01:01:01:01:01", "2017:01:01:23:00:00", "Year"], ["2016:01:01:01:01:01", "2017:01:01:23:00:00", "Hour"]]
Output
[null, null, null, null, [3, 2, 1], [2, 1]]

Explanation
LogSystem logSystem = new LogSystem();
logSystem.put(1, "2017:01:01:23:59:59");
logSystem.put(2, "2017:01:01:22:59:59");
logSystem.put(3, "2016:01:01:00:00:00");

// return [3,2,1], because you need to return all logs between 2016 and 2017.
logSystem.retrieve("2016:01:01:01:01:01", "2017:01:01:23:00:00", "Year");

// return [2,1], because you need to return all logs between Jan. 1, 2016 01:XX:XX and Jan. 1, 2017 23:XX:XX.
// Log 3 is not returned because Jan. 1, 2016 00:00:00 comes before the start of the range.
logSystem.retrieve("2016:01:01:01:01:01", "2017:01:01:23:00:00", "Hour");

 

Constraints:

  • 1 <= id <= 500
  • 2000 <= Year <= 2017
  • 1 <= Month <= 12
  • 1 <= Day <= 31
  • 0 <= Hour <= 23
  • 0 <= Minute, Second <= 59
  • granularity is one of the values ["Year", "Month", "Day", "Hour", "Minute", "Second"].
  • At most 500 calls will be made to put and retrieve.

Solutions

Solution 1

class LogSystem:
  def __init__(self):
    self.logs = []
    self.d = {
      "Year": 4,
      "Month": 7,
      "Day": 10,
      "Hour": 13,
      "Minute": 16,
      "Second": 19,
    }

  def put(self, id: int, timestamp: str) -> None:
    self.logs.append((id, timestamp))

  def retrieve(self, start: str, end: str, granularity: str) -> List[int]:
    i = self.d[granularity]
    return [id for id, ts in self.logs if start[:i] <= ts[:i] <= end[:i]]


# Your LogSystem object will be instantiated and called as such:
# obj = LogSystem()
# obj.put(id,timestamp)
# param_2 = obj.retrieve(start,end,granularity)
class LogSystem {
  private List<Log> logs = new ArrayList<>();
  private Map<String, Integer> d = new HashMap<>();

  public LogSystem() {
    d.put("Year", 4);
    d.put("Month", 7);
    d.put("Day", 10);
    d.put("Hour", 13);
    d.put("Minute", 16);
    d.put("Second", 19);
  }

  public void put(int id, String timestamp) {
    logs.add(new Log(id, timestamp));
  }

  public List<Integer> retrieve(String start, String end, String granularity) {
    List<Integer> ans = new ArrayList<>();
    int i = d.get(granularity);
    String s = start.substring(0, i);
    String e = end.substring(0, i);
    for (var log : logs) {
      String t = log.ts.substring(0, i);
      if (s.compareTo(t) <= 0 && t.compareTo(e) <= 0) {
        ans.add(log.id);
      }
    }
    return ans;
  }
}

class Log {
  int id;
  String ts;

  Log(int id, String ts) {
    this.id = id;
    this.ts = ts;
  }
}

/**
 * Your LogSystem object will be instantiated and called as such:
 * LogSystem obj = new LogSystem();
 * obj.put(id,timestamp);
 * List<Integer> param_2 = obj.retrieve(start,end,granularity);
 */
class LogSystem {
public:
  LogSystem() {
    d["Year"] = 4;
    d["Month"] = 7;
    d["Day"] = 10;
    d["Hour"] = 13;
    d["Minute"] = 16;
    d["Second"] = 19;
  }

  void put(int id, string timestamp) {
    logs.push_back({id, timestamp});
  }

  vector<int> retrieve(string start, string end, string granularity) {
    vector<int> ans;
    int i = d[granularity];
    auto s = start.substr(0, i);
    auto e = end.substr(0, i);
    for (auto& [id, ts] : logs) {
      auto t = ts.substr(0, i);
      if (s <= t && t <= e) {
        ans.emplace_back(id);
      }
    }
    return ans;
  }

private:
  vector<pair<int, string>> logs;
  unordered_map<string, int> d;
};

/**
 * 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);
 */
type LogSystem struct {
  logs []pair
  d  map[string]int
}

func Constructor() LogSystem {
  d := map[string]int{
    "Year":   4,
    "Month":  7,
    "Day":  10,
    "Hour":   13,
    "Minute": 16,
    "Second": 19,
  }
  return LogSystem{[]pair{}, d}
}

func (this *LogSystem) Put(id int, timestamp string) {
  this.logs = append(this.logs, pair{id, timestamp})
}

func (this *LogSystem) Retrieve(start string, end string, granularity string) (ans []int) {
  i := this.d[granularity]
  s, e := start[:i], end[:i]
  for _, log := range this.logs {
    t := log.ts[:i]
    if s <= t && t <= e {
      ans = append(ans, log.id)
    }
  }
  return
}

type pair struct {
  id int
  ts string
}

/**
 * Your LogSystem object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Put(id,timestamp);
 * param_2 := obj.Retrieve(start,end,granularity);
 */

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文