原题链接在这里: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. Django---自定义admin组件思维导图

  2. 2062326 齐力锋 实验二《Java面向对象程序设计》实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:   程序设计与数据结构           班级:      1623           姓名:  齐力锋      学 ...

  3. Google揭露SHA-1碰撞,加速数据重删字节对比

    原创 架构师技术联盟  近期,Google和道荷兰阿姆斯特研究者宣布攻破了世界上第一例公开的SHA-1哈希碰撞实例,业界一片哗然.当两组不同的数据(文件.一段数据)计算出相同的Hash值时,即视为二者 ...

  4. 华为S5700系列交换机配置通过Telnet登录设备

    声明:不管什么服务,都需要交换机开启服务,创建对应权限的用户,在通道下允许协议通过,缺一不可,以telnet为例. 组网图形 图1 配置通过Telnet登录设备组网图 组网需求 如图一所示,PC与设备 ...

  5. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

  6. 编写一个程序,将 a.txt 文件中的单词与 b.txt 文件中的单词交替合并到 c.txt 文件中,a.txt 文件中的单词用回车符分隔,b.txt 文件中用回车或空格进行分隔。

    package IO; import java.io.*; public class test { public void connectWords(File file1, File file2, F ...

  7. MapReduce程序——WordCount(Windows_Eclipse + Ubuntu14.04_Hadoop2.9.0)

    本文主要参考<Hadoop应用开发技术详解(作者:刘刚)> 一.工作环境 Windows7: Eclipse + JDK1.8.0 Ubuntu14.04:Hadoop2.9.0 二.准备 ...

  8. 六 web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode("utf-8")将字节转化成字符串 ...

  9. @ResponseBody与@RestController的作用与区别

    在使用springmvc框架的时候,在处理json的时候需要用到spring框架特有的注解@ResponseBody或者@RestController注解,这两个注解都会处理返回的数据格式,使用了该类 ...

  10. guava API整理

    1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection API Guava Basic Utilities IO API C ...