携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
痛苦周二,距离周末还有四天
设计有序流
该题出自力扣的1656题 —— 设计有序流【简单题】,确实简单
审题
有 n 个 (id, value) 对,其中 id 是 1 到 n 之间的一个整数,value 是一个字符串。不存在 id 相同的两个 (id, value) 对。
- 实现 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 。
- 否则,返回一个空列表。
-
题意很简单,就是实现一个类,类里面需要实现两个方法
- 初始化有序流,并初始化一个下标指针
- 存储数据
- 存储新的数据对,如果key 等于下标指针的话,那么输出从下标开始的连续数据对,否则输出空列表
-
利用一个字符串数组去定义流,再定义两个变量,分别记录流的长度和指针的当前位置
-
初始化有序流 —— 实例化字符串数组
-
存储数据
- 一开始想过利用List去做全局存储,每次调用方法前,先clear掉,后来发现,资源耗费太重,对于题目而言,返回的数据结构不考虑在内,因此使用clear的方法需要重新遍历,重新置空。
- 数组存储value,判断key是否等于当前指针,如果是,则从当前指针开始遍历
- 如果存在断开的,则直接返回队列
- 否则返回完整的队列,并且使指针 + 1
编码
class OrderedStream {
String[] stream;
int size;
int ptr;
public OrderedStream(int n) {
stream = new String[n + 1];
size = n + 1;
ptr = 1;
}
public List<String> insert(int idKey, String value) {
List<String> list= new ArrayList<>();
stream[idKey] = value;
if (idKey == ptr){
for (int i = idKey; i < size; i++) {
if (stream[i] == null){
ptr = i;
return list;
}
list.add(stream[i]);
ptr = i + 1;
}
}
return list;
}
}