vlambda博客
学习文章列表

【红黑树】981. 基于时间的键值存储(中等)

让我们看看这道题目的描述


这道题目属于设计类题目,我们要想一个合适的数据结构,用来保存变量。

我们可以用哈希表来实现,key为需要存储的键,value需要保存两个变量,一个为对应的值,另一个为时间戳,因为value在存储的时候,需要按时间戳来排序,故我们可以设计成红黑树

红黑树内部可以默认实现排序或者自定义排序,为我们省去了一些排序的操作

class TimeMap { private Map<String, TreeMap<Integer, String>> map; /** Initialize your data structure here. */ public TimeMap() { map = new HashMap<>(); }
public void set(String key, String value, int timestamp) { TreeMap<Integer, String> temp = map.getOrDefault(key, new TreeMap<>()); temp.put(timestamp, value); map.put(key, temp); }
public String get(String key, int timestamp) { if(!map.containsKey(key)) return ""; TreeMap<Integer, String> temp = map.get(key); if(temp.containsKey(timestamp)) return temp.get(timestamp); if(temp.floorKey(timestamp) != null) return temp.get(temp.floorKey(timestamp)); return "";
}}

这道题目的做法并不惟一,我们也可以用数组来保存对应的值,把数组的索引看作时间戳就可以。也可以自己实现一个内部类来实现。

class TimeMap {    private Map<String, String[]> map; public TimeMap() { map = new HashMap(); }  public void set(String key, String value, int timestamp) { if(!map.containsKey(key)){ String [] innerMap = new String[125000]; innerMap[timestamp] = value; map.put(key, innerMap); }else{ map.get(key)[timestamp] = value;  } } public String get(String key, int timestamp) { if(!map.containsKey(key)){ return ""; }else{ String[] tempMap = map.get(key); for(int i = timestamp - 1; i >= 0; i--){ if(null != tempMap[i+1]) return tempMap[i+1]; } return ""; } }}