Skip to content

Commit 1081eba

Browse files
committed
Add 1656 solution
1 parent 4704bf0 commit 1081eba

File tree

3 files changed

+136
-74
lines changed

3 files changed

+136
-74
lines changed

src/solution/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ mod s1408_string_matching_in_an_array;
2222
mod s1413_minimum_value_to_get_positive_step_by_step_sum;
2323
mod s1417_reformat_the_string;
2424
mod s1422_maximum_score_after_splitting_a_string;
25+
mod s1656_design_an_ordered_stream;
Lines changed: 72 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,81 @@
11
/**
2-
* [641] design circular deque
3-
* https://leetcode.cn/problems/design-circular-deque/
4-
*
5-
* 设计实现双端队列。
6-
*
7-
* 实现 MyCircularDeque 类:
8-
*
9-
* MyCircularDeque(int k) :构造函数,双端队列最大为 k 。
10-
* boolean insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true ,否则返回 false 。
11-
* boolean insertLast() :将一个元素添加到双端队列尾部。如果操作成功返回 true ,否则返回 false 。
12-
* boolean deleteFront() :从双端队列头部删除一个元素。 如果操作成功返回 true ,否则返回 false 。
13-
* boolean deleteLast() :从双端队列尾部删除一个元素。如果操作成功返回 true ,否则返回 false 。
14-
* int getFront() ):从双端队列头部获得一个元素。如果双端队列为空,返回 -1 。
15-
* int getRear() :获得双端队列的最后一个元素。 如果双端队列为空,返回 -1 。
16-
* boolean isEmpty() :若双端队列为空,则返回 true ,否则返回 false  。
17-
* boolean isFull() :若双端队列满了,则返回 true ,否则返回 false 。
18-
*  
19-
*
20-
* 示例 1:
21-
*
22-
* 输入
23-
* ["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"]
24-
* [[3], [1], [2], [3], [4], [], [], [], [4], []]
25-
* 输出
26-
* [null, true, true, true, false, 2, true, true, true, 4]
27-
*
28-
* 解释
29-
* MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3
30-
* circularDeque.insertLast(1); // 返回 true
31-
* circularDeque.insertLast(2); // 返回 true
32-
* circularDeque.insertFront(3); // 返回 true
33-
* circularDeque.insertFront(4); // 已经满了,返回 false
34-
* circularDeque.getRear(); // 返回 2
35-
* circularDeque.isFull(); // 返回 true
36-
* circularDeque.deleteLast(); // 返回 true
37-
* circularDeque.insertFront(4); // 返回 true
38-
* circularDeque.getFront(); // 返回 4
39-
 
40-
* 提示:
41-
*
42-
* 1 <= k <= 1000
43-
* 0 <= value <= 1000
44-
* insertFront, insertLast, deleteFront, deleteLast, getFront, getRear, isEmpty, isFull  调用次数不大于 2000 次
45-
*/
2+
* [641] design circular deque
3+
* https://leetcode.cn/problems/design-circular-deque/
4+
*
5+
* 设计实现双端队列。
6+
*
7+
* 实现 MyCircularDeque 类:
8+
*
9+
* MyCircularDeque(int k) :构造函数,双端队列最大为 k 。
10+
* boolean insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true ,否则返回 false 。
11+
* boolean insertLast() :将一个元素添加到双端队列尾部。如果操作成功返回 true ,否则返回 false 。
12+
* boolean deleteFront() :从双端队列头部删除一个元素。 如果操作成功返回 true ,否则返回 false 。
13+
* boolean deleteLast() :从双端队列尾部删除一个元素。如果操作成功返回 true ,否则返回 false 。
14+
* int getFront() ):从双端队列头部获得一个元素。如果双端队列为空,返回 -1 。
15+
* int getRear() :获得双端队列的最后一个元素。 如果双端队列为空,返回 -1 。
16+
* boolean isEmpty() :若双端队列为空,则返回 true ,否则返回 false  。
17+
* boolean isFull() :若双端队列满了,则返回 true ,否则返回 false 。
18+
*
19+
*
20+
* 示例 1:
21+
*
22+
* 输入
23+
* ["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"]
24+
* [[3], [1], [2], [3], [4], [], [], [], [4], []]
25+
* 输出
26+
* [null, true, true, true, false, 2, true, true, true, 4]
27+
*
28+
* 解释
29+
* MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3
30+
* circularDeque.insertLast(1); // 返回 true
31+
* circularDeque.insertLast(2); // 返回 true
32+
* circularDeque.insertFront(3); // 返回 true
33+
* circularDeque.insertFront(4); // 已经满了,返回 false
34+
* circularDeque.getRear(); // 返回 2
35+
* circularDeque.isFull(); // 返回 true
36+
* circularDeque.deleteLast(); // 返回 true
37+
* circularDeque.insertFront(4); // 返回 true
38+
* circularDeque.getFront(); // 返回 4
39+
40+
* 提示:
41+
*
42+
* 1 <= k <= 1000
43+
* 0 <= value <= 1000
44+
* insertFront, insertLast, deleteFront, deleteLast, getFront, getRear, isEmpty, isFull  调用次数不大于 2000 次
45+
*/
4646
struct MyCircularDeque {
4747
data: Vec<i32>,
4848
capacity: usize,
4949
front: usize,
5050
rear: usize,
5151
}
5252

53+
/**
54+
* 1. 队列空一位可以用来判断队列满、空
55+
* 2. 队列头指针和尾指针的移动是不同的,这里是根据题意头指针左移动后赋值,尾指针赋值后右移
56+
* 3. 防止指针溢出,要对 self.capacity 取模,在 rust 里 (self.rear - 1 + self.capacity) % self.capacity 编译会报错
57+
* 要写成 (self.rear + self.capacity + 1) % self.capacity 才行
58+
* 4. Vec::with_capacity(capacity) 是有容量,但是 length 为 0,这时候用 data[0] 是赋值不了的,编译报错,一定要用 vec![0; capacity]
59+
*/
60+
61+
/**
62+
* Your MyCircularDeque object will be instantiated and called as such:
63+
* let obj = MyCircularDeque::new(k);
64+
* let ret_1: bool = obj.insert_front(value);
65+
* let ret_2: bool = obj.insert_last(value);
66+
* let ret_3: bool = obj.delete_front();
67+
* let ret_4: bool = obj.delete_last();
68+
* let ret_5: i32 = obj.get_front();
69+
* let ret_6: i32 = obj.get_rear();
70+
* let ret_7: bool = obj.is_empty();
71+
* let ret_8: bool = obj.is_full();
72+
*/
5373

5474
/**
5575
* `&self` means the method takes an immutable reference.
5676
* If you need a mutable reference, change it to `&mut self` instead.
5777
*/
5878
impl MyCircularDeque {
59-
6079
fn new(k: i32) -> Self {
6180
let capacity = (k + 1) as usize;
6281
MyCircularDeque {
@@ -66,7 +85,7 @@ impl MyCircularDeque {
6685
rear: 0,
6786
}
6887
}
69-
88+
7089
fn insert_front(&mut self, value: i32) -> bool {
7190
if self.is_full() {
7291
return false;
@@ -75,7 +94,7 @@ impl MyCircularDeque {
7594
self.data[self.front] = value;
7695
true
7796
}
78-
97+
7998
fn insert_last(&mut self, value: i32) -> bool {
8099
if self.is_full() {
81100
return false;
@@ -84,64 +103,43 @@ impl MyCircularDeque {
84103
self.rear = (self.rear + 1) % self.capacity;
85104
true
86105
}
87-
106+
88107
fn delete_front(&mut self) -> bool {
89108
if self.is_empty() {
90109
return false;
91110
}
92111
self.front = (self.front + 1) % self.capacity;
93112
true
94113
}
95-
114+
96115
fn delete_last(&mut self) -> bool {
97116
if self.is_empty() {
98117
return false;
99118
}
100119
self.rear = (self.rear + self.capacity - 1) % self.capacity;
101120
true
102121
}
103-
122+
104123
fn get_front(&self) -> i32 {
105124
if self.is_empty() {
106125
return -1;
107126
}
108127
self.data[self.front]
109128
}
110-
129+
111130
fn get_rear(&self) -> i32 {
112131
if self.is_empty() {
113132
return -1;
114133
}
115134
let rear = (self.rear + self.capacity - 1) % self.capacity;
116135
self.data[rear]
117136
}
118-
137+
119138
fn is_empty(&self) -> bool {
120139
self.front == self.rear
121140
}
122-
141+
123142
fn is_full(&self) -> bool {
124143
self.front == (self.rear + 1) % self.capacity
125144
}
126145
}
127-
128-
/**
129-
* Your MyCircularDeque object will be instantiated and called as such:
130-
* let obj = MyCircularDeque::new(k);
131-
* let ret_1: bool = obj.insert_front(value);
132-
* let ret_2: bool = obj.insert_last(value);
133-
* let ret_3: bool = obj.delete_front();
134-
* let ret_4: bool = obj.delete_last();
135-
* let ret_5: i32 = obj.get_front();
136-
* let ret_6: i32 = obj.get_rear();
137-
* let ret_7: bool = obj.is_empty();
138-
* let ret_8: bool = obj.is_full();
139-
*/
140-
141-
/**
142-
* 1. 队列空一位可以用来判断队列满、空
143-
* 2. 队列头指针和尾指针的移动是不同的,这里是根据题意头指针左移动后赋值,尾指针赋值后右移
144-
* 3. 防止指针溢出,要对 self.capacity 取模,在 rust 里 (self.rear - 1 + self.capacity) % self.capacity 编译会报错
145-
* 要写成 (self.rear + self.capacity + 1) % self.capacity 才行
146-
* 4. Vec::with_capacity(capacity) 是有容量,但是 length 为 0,这时候用 data[0] 是赋值不了的,编译报错,一定要用 vec![0; capacity]
147-
*/
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/**
2+
* [1656] design an ordered stream
3+
* https://leetcode.cn/problems/design-an-ordered-stream/
4+
*/
5+
6+
struct OrderedStream {
7+
data: Vec<String>,
8+
ptr: usize,
9+
}
10+
11+
/**
12+
* `&self` means the method takes an immutable reference.
13+
* If you need a mutable reference, change it to `&mut self` instead.
14+
*/
15+
impl OrderedStream {
16+
fn new(n: i32) -> Self {
17+
OrderedStream {
18+
data: vec![String::with_capacity(5); n as usize],
19+
ptr: 1,
20+
}
21+
}
22+
23+
fn insert(&mut self, id_key: i32, value: String) -> Vec<String> {
24+
let index = (id_key - 1) as usize;
25+
self.data[index] = value;
26+
27+
let mut list: Vec<String> = vec![];
28+
if self.ptr != id_key as usize {
29+
return list;
30+
}
31+
32+
let length = self.data.len();
33+
let mut position = self.ptr - 1;
34+
while position < length && self.data[position].len() == 5 {
35+
let item = self.data[position].clone();
36+
list.push(item);
37+
position += 1;
38+
}
39+
self.ptr = position + 1;
40+
list
41+
}
42+
}
43+
44+
/**
45+
* Your OrderedStream object will be instantiated and called as such:
46+
* let obj = OrderedStream::new(n);
47+
* let ret_1: Vec<String> = obj.insert(idKey, value);
48+
*/
49+
50+
#[cfg(test)]
51+
mod tests {
52+
use super::OrderedStream;
53+
54+
#[test]
55+
fn test_1656() {
56+
let mut os = OrderedStream::new(5);
57+
assert_eq!(os.insert(3, "ccccc".to_string()), Vec::<String>::new());
58+
assert_eq!(os.insert(1, "aaaaa".to_string()), vec!["aaaaa"]);
59+
assert_eq!(os.insert(2, "bbbbb".to_string()), vec!["bbbbb", "ccccc"]);
60+
assert_eq!(os.insert(5, "eeeee".to_string()), Vec::<String>::new());
61+
assert_eq!(os.insert(4, "ddddd".to_string()), vec!["ddddd", "eeeee"]);
62+
}
63+
}

0 commit comments

Comments
 (0)