力扣(leetcode)每日一题 1656 设计有序流
1656. 设计有序流 - 力扣(LeetCode)
题目
有 n
个 (id, value)
对,其中 id
是 1
到 n
之间的一个整数,value
是一个字符串。不存在 id
相同的两个 (id, value)
对。
设计一个流,以 任意 顺序获取 n
个 (id, value)
对,并在多次调用时 按 id
递增的顺序 返回一些值。
实现 OrderedStream
类:
OrderedStream(int n)
构造一个能接收n
个值的流,并将当前指针ptr
设为1
。String[] insert(int id, String value)
向流中存储新的(id, value)
对。存储后:- 如果流存储有
id = ptr
的(id, value)
对,则找出从id = ptr
开始的 最长 id 连续递增序列 ,并 按顺序 返回与这些 id 关联的值的列表。然后,将ptr
更新为最后那个id + 1
。 - 否则,返回一个空列表。
- 如果流存储有
题目比较抽象,但是看动画很容易明白。
解法一
建立一个索引数组,如果差值为1,说明连续,就可以进行弹出。并且index加1 这里的写法不好理解
假如我有一个长度5的stream。然后一次放5,4,3,2,这时候index队列为
4 4 3 2 1
当放1的时候形成 5 4 3 2 1
就可以全部弹出。就像是楼梯一样。
class OrderedStream {
int index = 1;
int[] indexlist;
String[] valuelist;
public OrderedStream(int n) {
indexlist = new int[n + 1];
valuelist = new String[n + 1];
}
public List<String> insert(int idKey, String value) {
for (int i = index; i <= idKey; i++) {
indexlist[i]++;
}
valuelist[idKey] = value;
List<String> list = new ArrayList<>();
while ((index == indexlist.length - 1 && valuelist[indexlist.length - 1] != null)
|| (index < indexlist.length - 1 && indexlist[index] == indexlist[index + 1] + 1)) {
// index如果为最后一个,并且有值一定要弹出。如果不是最后一个需要判断是否和下一个差1
list.add(valuelist[index]);
index++;
}
return list;
}
}
解法二 上面的思路比较乱,进行了简化
class OrderedStream {
int index = 1;
HashMap<Integer, String> map;
public OrderedStream(int n) {
map = new HashMap<>();
}
public List<String> insert(int idKey, String value) {
map.put(idKey, value);
List<String> res = new ArrayList<>();
// 如果有,就加入队列弹出。并且index加一。这里覆盖了各种极端情况,弹出一个,越界等
while (map.get(index) != null) {
String s = map.get(index);
res.add(s);
index++;
}
return res;
}
}
解法三 将上面的map改为数组
class OrderedStream {
int index = 1;
String[] valuelist;
public OrderedStream(int n) {
valuelist = new String[n + 1];
}
public List<String> insert(int idKey, String value) {
valuelist[idKey] = value;
List<String> res = new ArrayList<>();
// 如果有,就加入队列弹出。并且index加一。这里覆盖了各种极端情况,弹出一个,越界等
while (index != valuelist.length && valuelist[index] != null) {
String s = valuelist[index];
res.add(s);
index++;
}
return res;
}
}
这已经是最优解了,刷新一下就变成了前百分之96了
总结
解法一没有很简洁,但是是最先想到的。反而越是简单精妙的结构,越是不好短时间抽象出来