0%

『LeetCode』1656 设计有序流

题目

1656. 设计有序流

n(id, value) 对,其中 id1n 之间的一个整数,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 。
      • 否则,返回一个空列表。

示例:

q1

输入
["OrderedStream", "insert", "insert", "insert", "insert", "insert"]
[[5], [3, "ccccc"], [1, "aaaaa"], [2, "bbbbb"], [5, "eeeee"], [4, "ddddd"]]
输出
[null, [], ["aaaaa"], ["bbbbb", "ccccc"], [], ["ddddd", "eeeee"]]

解释
OrderedStream os= new OrderedStream(5);
os.insert(3, "ccccc"); // 插入 (3, "ccccc"),返回 []
os.insert(1, "aaaaa"); // 插入 (1, "aaaaa"),返回 ["aaaaa"]
os.insert(2, "bbbbb"); // 插入 (2, "bbbbb"),返回 ["bbbbb", "ccccc"]
os.insert(5, "eeeee"); // 插入 (5, "eeeee"),返回 []
os.insert(4, "ddddd"); // 插入 (4, "ddddd"),返回 ["ddddd", "eeeee"]

提示:

  • 1 <= n <= 1000
  • 1 <= id <= n
  • value.length == 5
  • value 仅由小写字母组成
  • 每次调用 insert 都会使用一个唯一的 id
  • 恰好调用 ninsert

标签

设计, 数组, 哈希表, 数据流


题解

【设计有序流】简单模拟

模拟

看完题目描述晕晕的,但没关系,题目给出了每个方法的具体内容,照做即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Code language: Python
class OrderedStream:

def __init__(self, n: int):
self.stream = [None] * (n + 1)
self.ptr = 1

def insert(self, idKey: int, value: str) -> List[str]:
self.stream[idKey] = value
if idKey == self.ptr:
ans = list()
for i in range(idKey, len(self.stream)):
if self.stream[i] is None:
break
ans.append(self.stream[i])
self.ptr = i
return ans
return list()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Code language: Java
class OrderedStream {
String[] stream;
int ptr;
public OrderedStream(int n) {
stream = new String[n + 1];
ptr = 1;
}

public List<String> insert(int idKey, String value) {
stream[idKey] = value;
if (idKey == ptr) {
List<String> ans = new ArrayList<>();
for (int i = idKey, n = stream.length; i < n; ++i) {
if (stream[i] == null) break;
ans.add(stream[i]);
}
ptr = idKey + ans.size();
return ans;
}
return new ArrayList<>();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Code language: C++
class OrderedStream {
public:
vector<string> stream;
int ptr;
OrderedStream(int n): ptr(1) {
stream.resize(n + 1);
}

vector<string> insert(int idKey, string value) {
stream[idKey] = value;
if (idKey == ptr) {
int right = idKey;
for (int n = stream.size(); right < n; ++right) {
if (stream[right] == "") break;
}
ptr = right;
return vector<string> (stream.begin() + idKey, stream.begin() + right);
}
return vector<string> ();
}
};
  • 时间复杂度: \(O(n)\)
  • 空间复杂度: \(O(n)\)

如果对你有帮助的话,请给我点个赞吧~

欢迎前往 我的博客Algorithm - Github 查看更多题解

--- ♥ end ♥ ---

欢迎关注我呀~