1656.设计有序流
This commit is contained in:
parent
0f5d520917
commit
7e1045ccca
|
@ -8,3 +8,4 @@ mod q0705;
|
|||
mod q0706;
|
||||
mod q0707;
|
||||
mod q0715;
|
||||
mod q1656;
|
||||
|
|
|
@ -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()]);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue