1656.设计有序流

This commit is contained in:
游由 2022-08-17 19:41:07 +08:00
parent 0f5d520917
commit 7e1045ccca
2 changed files with 87 additions and 0 deletions

View File

@ -8,3 +8,4 @@ mod q0705;
mod q0706;
mod q0707;
mod q0715;
mod q1656;

86
rust/src/design/q1656.rs Normal file
View File

@ -0,0 +1,86 @@
use crate::Solution;
/// [1656.设计有序流](https://leetcode-cn.com/problems/design-an-ordered-stream/)
///
/// 2022-08-16 21:13:15
///
/// 有 `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` 。
/// * 否则,返回一个空列表。
/// + **示例:**
/// + **![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2020/11/15/q1.gif)**
/// + **输入**
/// \["OrderedStream", "insert", "insert", "insert", "insert", "insert"\]
/// \[\[5\], \[3, "ccccc"\], \[1, "aaaaa"\], \[2, "bbbbb"\], \[5, "eeeee"\], \[4, "ddddd"\]\]
/// + **输出**
/// \[null, \[\], \["aaaaa"\], \["bbbbb", "ccccc"\], \[\], \["ddddd", "eeeee"\]\]
/// + **解释**
/// ```java
/// 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`
/// * 恰好调用 `n` 次 `insert`
/// + Related Topics
/// * 设计
/// * 数组
/// * 哈希表
/// * 数据流
#[derive(Debug)]
struct OrderedStream {
idx: i32,
data: std::collections::HashMap<i32, String>,
}
impl OrderedStream {
fn new(n: i32) -> Self {
OrderedStream {
idx: 1,
data: std::collections::HashMap::new(),
}
}
fn insert(&mut self, id_key: i32, value: String) -> Vec<String> {
self.data.entry(id_key).or_insert(value);
let s = self.idx;
for i in s.. {
if !self.data.contains_key(&i) {
self.idx = i;
break;
}
}
(s..self.idx).map(|i| self.data.remove(&i).unwrap()).collect()
}
}
#[cfg(test)]
mod test {
use crate::Solution;
use crate::design::q1656::OrderedStream;
#[test]
fn test_q1656() {
let mut obj = OrderedStream::new(2);
assert_eq!(obj.insert(3, "ccccc".to_owned()), Vec::<String>::new());
assert_eq!(obj.insert(1, "aaaaa".to_owned()), vec!["aaaaa".to_owned()]);
assert_eq!(obj.insert(2, "bbbbb".to_owned()), vec!["bbbbb".to_owned(), "ccccc".to_owned()]);
assert_eq!(obj.insert(5, "eeeee".to_owned()), Vec::<String>::new());
assert_eq!(obj.insert(4, "ddddd".to_owned()), vec!["ddddd".to_owned(), "eeeee".to_owned()]);
}
}