原题链接在这里:https://leetcode.com/problems/design-log-storage-system/description/

题目:

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.

题解:

Inorder to retireve range of timestamp. It needs a linear data structure to store log based on timestamp. It could be list or array, but every time, it needs to retrieve everything again.

Or we could use TreeMap. Thus timestamp is sorted.

When we have the start and end time, revise a little bit from the granularity index.

Use TreeMap subMap to get sub map range from [start, end] timestamp.

And add values to res.

Time Complexity: put, O(logn). n = current count of log. retrieve(logn + m). m = count of logs between start and end.

Space: O(n).

AC Java:

 class LogSystem {
private TreeMap<String, HashSet<Integer>> treeMap;
private HashMap<String, Integer> map;
private String min = "2000:01:01:00:00:00";
private String max = "2017:12:31:23:59:59"; public LogSystem() {
this.treeMap = new TreeMap<>();
this.map = new HashMap<>();
map.put("Year", 4);
map.put("Month", 7);
map.put("Day", 10);
map.put("Hour", 13);
map.put("Minute", 16);
map.put("Second", 19);
} public void put(int id, String timestamp) {
treeMap.putIfAbsent(timestamp, new HashSet<>());
treeMap.get(timestamp).add(id);
} public List<Integer> retrieve(String s, String e, String gra) {
int index = map.get(gra);
String start = s.substring(0, index) + min.substring(index);
String end = e.substring(0, index) + max.substring(index); Map<String, HashSet<Integer>> subMap = treeMap.subMap(start, true, end, true);
List<Integer> res = new ArrayList<>();
for(Map.Entry<String, HashSet<Integer>> entry : subMap.entrySet()){
res.addAll(entry.getValue());
} return res;
}
} /**
* Your LogSystem object will be instantiated and called as such:
* LogSystem obj = new LogSystem();
* obj.put(id,timestamp);
* List<Integer> param_2 = obj.retrieve(s,e,gra);
*/

用list直接存log. 根据granularity取出timestamp的substring直接比较.

Time Complexity: put, O(1). retrieve, O(logs.size()).

Space: O(logs.size()).

AC Java:

 class LogSystem {
List<String []> logs;
List<String> units = Arrays.asList("Year", "Month", "Day", "Hour", "Minute", "Second");
int [] indices = new int[]{4,7,10,13,16,19}; public LogSystem() {
logs = new LinkedList<String []>();
} public void put(int id, String timestamp) {
logs.add(new String[]{Integer.toString(id), timestamp});
} public List<Integer> retrieve(String s, String e, String gra) {
List<Integer> res = new ArrayList<Integer>();
int ind = indices[units.indexOf(gra)]; String sSub = s.substring(0, ind);
String eSub = e.substring(0, ind); for(String [] log : logs){
String sub = log[1].substring(0, ind);
if(sub.compareTo(sSub)>=0 && sub.compareTo(eSub)<=0){
res.add(Integer.valueOf(log[0]));
}
}
return res;
}
} /**
* Your LogSystem object will be instantiated and called as such:
* LogSystem obj = new LogSystem();
* obj.put(id,timestamp);
* List<Integer> param_2 = obj.retrieve(s,e,gra);
*/

LeetCode Design Log Storage System的更多相关文章

  1. [LeetCode] Design Log Storage System 设计日志存储系统

    You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...

  2. Design Log Storage System

    You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...

  3. [leetcode-635-Design Log Storage System]

    You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...

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

    Design a search autocomplete system for a search engine. Users may input a sentence (at least one wo ...

  5. [LeetCode] Design In-Memory File System 设计内存文件系统

    Design an in-memory file system to simulate the following functions: ls: Given a path in string form ...

  6. Bigtable: A Distributed Storage System for Structured Data

    https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf Abstr ...

  7. Storage System and File System Courses

    I researched a lot about storage system classes given at good universities this year. This had two r ...

  8. 1.1 Introduction中 Kafka as a Storage System官网剖析(博主推荐)

    不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka as a Storage System kafka作为一个存储系统 An ...

  9. Blockstack: A Global Naming and Storage System Secured by Blockchains

    作者:Muneeb Ali, Jude Nelson, Ryan Shea, and Michael Freedman Blockstack Labs and Princeton University ...

随机推荐

  1. HTML5/CSS3实现图片倒影效果

    在线演示 本地下载

  2. 64位机的pl/sql不安装32位oracle的连接方式

    第一步:下载即时客户端包    在Oralce官方网站上下载Oracle Instantclient Basic package.地址如下:http://www.oracle.com/technetw ...

  3. Hebernate -- 映射继承关系

    1. Employee 为基类, 派生出HourEmployee 和 SalaryEmployee两个类. 采用 subclass 元素的继承映射(1) 采用 subclass 的继承映射可以实现对于 ...

  4. JQuery -- 介绍,选择器及其示例, 基本选择器,层次选择器,过滤选择器,表单选择器

    1. 什么是jQuery对象 jQuery 对象就是通过jQuery包装DOM对象后产生的对象. jQuery对象是jQuery独有的.如果一个对象是jQuery对象,那么它就可以使用jQuery里的 ...

  5. MINA学习汇总

    MINA学习汇总 Apache Mina Server 是一个网络通信应用框架,用于开发高性能和高可用性的网络应用程序.它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(然,也可以提供JAVA ...

  6. 关于angularJS的$watch的 一些小用法

    $watch方法,它可以帮助我们在每个scope中监视其中的变量. $watch 单一的变量 对于普通的变量时,如数字,字符串等,直接如下写是可以监视到变量的变化,并执行相应的函数的. $scope. ...

  7. linux安装-----源码安装步骤--zlib软件安装

    该zlib 可以对许多其他软件的编译代码起着优化 压缩作用. 解压压缩包: .tar.gz------------->tar zxvf 压缩包.tar.gz .tar.bz2---------- ...

  8. matlab 学习笔记

    脚本名称不能与matlab里面的关键字一样.否则会报当MATLAB中报错,“SCRIPT ******”怎么解决 保留已画图形:hold on 矩阵连接:横向 f=[m,n];   纵向 f=[m;n ...

  9. linux下{}的用法

    在touch {a,b}.txt时,同时创建了a.txt,b.txt两个文件 而touch {1..10}.txt,同时创建了10个txt文件,从1.txt到10.txt 在linux通配符中,{n, ...

  10. Firefox 下载、附加组件、Flash插件、缓存位置(附加Chrome下载和Opera下载)

    Firefox 下载的FTP页面: http://ftp.mozilla.org/pub/firefox/releases/ Firefox下载官方页面: https://www.mozilla.or ...