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如果为最后一个,并且有值一定要弹出。如果不是最后一个需要判断是否和下一个差1list.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了
总结
解法一没有很简洁,但是是最先想到的。反而越是简单精妙的结构,越是不好短时间抽象出来