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

参考资料:

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

本文转自博客园Grandyang的博客,原文链接:[LeetCode] Design Log Storage System 设计日志存储系统

,如需转载请自行联系原博主。

时间: 2024-10-25 04:19:48

[LeetCode] Design Log Storage System 设计日志存储系统的相关文章

[LeetCode] Design Search Autocomplete System 设计搜索自动补全系统

Design a search autocomplete system for a search engine. Users may input a sentence (at least one word and end with a special character '#'). For each character they type except '#', you need to return the top 3historical hot sentences that have pref

[LeetCode] Design Excel Sum Formula 设计Excel表格求和公式

Your task is to design the basic function of Excel and implement the function of sum formula. Specifically, you need to implement the following functions: Excel(int H, char W): This is the constructor. The inputs represents the height and width of th

[LeetCode] Design TinyURL 设计精简URL地址

Note: For the coding companion problem, please see: Encode and Decode TinyURL. How would you design a URL shortening service that is similar to TinyURL? Background: TinyURL is a URL shortening service where you enter a URL such as https://leetcode.co

Cassandra - A Decentralized Structured Storage System

http://www.cs.cornell.edu/projects/ladis2009/papers/lakshman-ladis2009.pdf, 英文 http://www.dbthink.com/?p=372, 中文 对Cassandra并没有深入研究, 在data server上copy了bigtable, 而在分布式nodes管理上copy了Dynamo的去中心化的架构, 可以认为是去中心化设计的Bigtable. 当然他在copy bigtable的数据模型和SSTable机制的同

bigtable: A Distributed Storage System for Structured Data

bigtable: A Distributed Storage System for Structured Data http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en//archive/bigtable-osdi06.pdf http://www.dbthink.com/?p=493, 中文翻译   总结 A Bigtable is a sparse, distri

如何使用log miner分析oracle日志_oracle

当我们不小心误操作致使数据库数据丢失.改变时, 需要对数据库对象做基于时间点的恢复,找到我们需要的数据,这个时间点不能认为精确确定,我们可以通过对oracle日志进行分析,而获得无操作的精确时间点. oracle db提供了一个分析日志包logmnr logminer 工具的使用 -------对redo log 进行挖掘,找出在某个时间点所作的DDL 或DML 操作(包括:时间点.datablock scn .sql语句) 实验测试 SQL> select name from v$archiv

云服务器-[log]关于log4j 创建日志服务的问题

问题描述 [log]关于log4j 创建日志服务的问题 log4j.logger.com.webpayment=info, test1 log4j.appender.test1=org.apache.log4j.net.SocketAppender log4j.appender.test1.RemoteHost=192.168.1.115 log4j.appender.test1.Port=8899 log4j.appender.test1.application=test1 在这个代码中,Re

SAP WM 虚拟Storage Type设计案例之 - Fixed Bin Storage Type 里实现FIFO –

SAP WM 虚拟Storage Type设计案例之 - Fixed Bin Storage Type 里实现FIFO – 笔者所在的SAP实施项目里,有部分采购物料是存放在固定货架上.业务要求,存储在这些货架上的物料,要能在SAP系统上较好的管理与实现先进先出(FIFO).   前提:项目里的全球模板里不启用SAP Batch Management,而是一个与库存无关的弱批次管理功能 – Documentary Batch, 以实现追溯.业务仓库空间很有限,这些物料只能固定存储,不能放在其它货

DB2面向OLTP环境的物理数据库设计:存储系统

与独立磁盘相比,存储系统提供了许多优势,包括降低http://www.aliyun.com/zixun/aggregation/14290.html">存储管理开销.更好的性能.巨大的存储服务器缓存.多路径访问.备用电池.更高的可靠性和更高的可用性. 最近,通常为 DB2 数据库服务器提供服务的并不是独立磁盘,而是中高端的存储系统,比如 IBM System Storage® DS6800 和 DS8300. 尽管最近固态设备 (SSD) 取得了成功,但磁盘仍然是数据中心的规范.因为处理器