携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
一、题目
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 <= n <= 1000
1 <= id <= n
value.length == 5
value 仅由小写字母组成
每次调用 insert 都会使用一个唯一的 id
恰好调用 n 次 insert
二、题解
按题目要求设计一个有序流,存储一些序列(id, value),id是唯一的整数,vlaue是字符串,要可以获取一些序列对,按id的递增顺序返回。
方法一
首先给定的有两个方法待实现,OrderedStream(int n)构造方法要求初始化这个有序流,也就是得设置这个有序流的容量能存储多少个序列,同时还要初始化ptr指针。insert(int idKey, String value)方法可以实现往有序流中存储序列,存储完成后可能还得返回一些id递增的有序序列,也就是说如果ptr指针所指的索引与对应相等的id存在这个序列的话,则需要从ptr指针位置开始按顺序返回存在的id连续的一些序列,最后更新ptr指针执行最后一个id的后一个位置。如果没有ptr指针对应的id存在则返回空即可。例如初始化一个n为5的有序流(可以理解有1、2、3、4、5个位置可以插入值),初始的ptr指针也就指向有序流的第一个位置1处。这时如果插入一个序列(3, "ccc"),那么就是在有序流的索引位置3处插入值"ccc",这时ptr指针位置不存在序列所以不用变;如果再插入一个序列(1, "aaa"),那么就是在有序流的位置1处插入值"aaa",这时ptr指针所指的位置1处存在序列,那么就返回ptr指针位置开始的连续序列即["aaaaa"],因为位置2处不存在序列了就结束,同时更新ptr指针到位置2处。对此可以用数组来模拟这个有序流,数组的索引下标就对应有序流的序列中的id,数组的元素值就存储有序流的序列中的value,数组的下标是从0开始,为了直观的使id和数组下标对应,所以构造方法初始化数组大小的时候可以建为n + 1大小的数组,同时ptr指针就指向索引1处;然后插入序列的方法就可以直接对数组中索引id处赋值为value即可,同时判断ptr指针指向索引不超过数组大小,并且ptr指针指向索引存在元素,则需要将这个元素加入到待返回序列集合中,同时ptr指针往后移动一个索引,循环获取之后符号条件的元素值,直到ptr指针超出边界或者ptr指针位置不存在元素为止,最后返回记录的序列值集合。
三、代码
方法一 Java代码
class OrderedStream {
private String[] elements;
private int ptr;
public OrderedStream(int n) {
elements = new String[n + 1];
ptr = 1;
}
public List<String> insert(int idKey, String value) {
elements[idKey] = value;
List<String> list = new ArrayList<String>();
while (ptr < elements.length && elements[ptr] != null) {
list.add(elements[ptr]);
ptr++;
}
return list;
}
}
时间复杂度:O(n),插入序列值时需要返回有序的存在序列,可能需要遍历数组。
空间复杂度:O(n),使用数组来模拟有序流存储序列值。