Skip to content

Commit bdf018b

Browse files
committed
feat: add solutions to lcof problems
- 面试题37. 序列化二叉树 - 面试题38. 字符串的排列 - 面试题59 - I. 滑动窗口的最大值 - 面试题59 - II. 队列的最大值
1 parent 449a2bf commit bdf018b

File tree

10 files changed

+463
-0
lines changed

10 files changed

+463
-0
lines changed

lcof/面试题37. 序列化二叉树/README.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@ public class Codec {
170170

171171
### **JavaScript**
172172

173+
层序遍历:
174+
173175
```js
174176
/**
175177
* Definition for a binary tree node.
@@ -235,6 +237,59 @@ var deserialize = function (data) {
235237
*/
236238
```
237239

240+
前序遍历:
241+
242+
```js
243+
/**
244+
* Definition for a binary tree node.
245+
* function TreeNode(val) {
246+
* this.val = val;
247+
* this.left = this.right = null;
248+
* }
249+
*/
250+
251+
/**
252+
* Encodes a tree to a single string.
253+
*
254+
* @param {TreeNode} root
255+
* @return {string}
256+
*/
257+
var serialize = function (root) {
258+
if (root == null) {
259+
return '#';
260+
}
261+
const { val, left, right } = root;
262+
return `${val},${serialize(left)},${serialize(right)}`;
263+
};
264+
265+
/**
266+
* Decodes your encoded data to tree.
267+
*
268+
* @param {string} data
269+
* @return {TreeNode}
270+
*/
271+
var deserialize = function (data) {
272+
const vals = data.split(',');
273+
let index = 0;
274+
const dfs = () => {
275+
if (vals[index] == '#') {
276+
index++;
277+
return null;
278+
}
279+
const res = new TreeNode(vals[index++]);
280+
res.left = dfs();
281+
res.right = dfs();
282+
return res;
283+
};
284+
return dfs();
285+
};
286+
287+
/**
288+
* Your functions will be called as such:
289+
* deserialize(serialize(root));
290+
*/
291+
```
292+
238293
### **...**
239294

240295
```

lcof/面试题38. 字符串的排列/README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,60 @@ public:
156156
};
157157
```
158158

159+
### **TypeScript**
160+
161+
```ts
162+
function permutation(s: string): string[] {
163+
const n = s.length;
164+
const cs = s.split('');
165+
const set = new Set<string>();
166+
const dfs = (i: number) => {
167+
if (i === n) {
168+
set.add(cs.join(''));
169+
return;
170+
}
171+
dfs(i + 1);
172+
for (let j = i + 1; j < n; j++) {
173+
[cs[i], cs[j]] = [cs[j], cs[i]];
174+
dfs(i + 1);
175+
[cs[i], cs[j]] = [cs[j], cs[i]];
176+
}
177+
};
178+
dfs(0);
179+
return [...set];
180+
}
181+
```
182+
183+
### **Rust**
184+
185+
```rust
186+
use std::collections::HashSet;
187+
impl Solution {
188+
fn dfs(i: usize, cs: &mut Vec<char>, res: &mut Vec<String>) {
189+
if i == cs.len() {
190+
res.push(cs.iter().collect());
191+
return;
192+
}
193+
let mut set = HashSet::new();
194+
for j in i..cs.len() {
195+
if set.contains(&cs[j]) {
196+
continue;
197+
}
198+
set.insert(cs[j]);
199+
cs.swap(i, j);
200+
Self::dfs(i + 1, cs, res);
201+
cs.swap(i, j);
202+
}
203+
}
204+
205+
pub fn permutation(s: String) -> Vec<String> {
206+
let mut res = Vec::new();
207+
Self::dfs(0, &mut s.chars().collect(), &mut res);
208+
res
209+
}
210+
}
211+
```
212+
159213
### **...**
160214

161215
```
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use std::collections::HashSet;
2+
impl Solution {
3+
fn dfs(i: usize, cs: &mut Vec<char>, res: &mut Vec<String>) {
4+
if i == cs.len() {
5+
res.push(cs.iter().collect());
6+
return;
7+
}
8+
let mut set = HashSet::new();
9+
for j in i..cs.len() {
10+
if set.contains(&cs[j]) {
11+
continue;
12+
}
13+
set.insert(cs[j]);
14+
cs.swap(i, j);
15+
Self::dfs(i + 1, cs, res);
16+
cs.swap(i, j);
17+
}
18+
}
19+
20+
pub fn permutation(s: String) -> Vec<String> {
21+
let mut res = Vec::new();
22+
Self::dfs(0, &mut s.chars().collect(), &mut res);
23+
res
24+
}
25+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
function permutation(s: string): string[] {
2+
const n = s.length;
3+
const cs = s.split('');
4+
const set = new Set<string>();
5+
const dfs = (i: number) => {
6+
if (i === n) {
7+
set.add(cs.join(''));
8+
return;
9+
}
10+
dfs(i + 1);
11+
for (let j = i + 1; j < n; j++) {
12+
[cs[i], cs[j]] = [cs[j], cs[i]];
13+
dfs(i + 1);
14+
[cs[i], cs[j]] = [cs[j], cs[i]];
15+
}
16+
};
17+
dfs(0);
18+
return [...set];
19+
}

lcof/面试题59 - I. 滑动窗口的最大值/README.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,72 @@ func maxSlidingWindow(nums []int, k int) []int {
182182
}
183183
```
184184

185+
### **TypeScript**
186+
187+
```ts
188+
function maxSlidingWindow(nums: number[], k: number): number[] {
189+
const n = nums.length;
190+
const res = [];
191+
if (n === 0 || k === 0) {
192+
return res;
193+
}
194+
const queue = [];
195+
for (let i = 0; i < k; i++) {
196+
while (queue.length !== 0 && queue[queue.length - 1] < nums[i]) {
197+
queue.pop();
198+
}
199+
queue.push(nums[i]);
200+
}
201+
res.push(queue[0]);
202+
for (let i = k; i < n; i++) {
203+
if (queue[0] === nums[i - k]) {
204+
queue.shift();
205+
}
206+
while (queue.length !== 0 && queue[queue.length - 1] < nums[i]) {
207+
queue.pop();
208+
}
209+
queue.push(nums[i]);
210+
res.push(queue[0]);
211+
}
212+
return res;
213+
}
214+
```
215+
216+
### **Rust**
217+
218+
```rust
219+
use std::collections::VecDeque;
220+
impl Solution {
221+
pub fn max_sliding_window(nums: Vec<i32>, k: i32) -> Vec<i32> {
222+
let k = k as usize;
223+
let n = nums.len();
224+
if n == 0 || k == 0 {
225+
return Vec::new();
226+
}
227+
let mut res = vec![0; n - k + 1];
228+
let mut queue = VecDeque::new();
229+
for i in 0..k {
230+
while !queue.is_empty() && *queue.back().unwrap() < nums[i] {
231+
queue.pop_back();
232+
}
233+
queue.push_back(nums[i]);
234+
}
235+
res[0] = queue[0];
236+
for i in k..n {
237+
if nums[i - k] == queue[0] {
238+
queue.pop_front();
239+
}
240+
while !queue.is_empty() && *queue.back().unwrap() < nums[i] {
241+
queue.pop_back();
242+
}
243+
queue.push_back(nums[i]);
244+
res[i - k + 1] = queue[0];
245+
}
246+
res
247+
}
248+
}
249+
```
250+
185251
### **...**
186252

187253
```
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use std::collections::VecDeque;
2+
impl Solution {
3+
pub fn max_sliding_window(nums: Vec<i32>, k: i32) -> Vec<i32> {
4+
let k = k as usize;
5+
let n = nums.len();
6+
if n == 0 || k == 0 {
7+
return Vec::new();
8+
}
9+
let mut res = vec![0; n - k + 1];
10+
let mut queue = VecDeque::new();
11+
for i in 0..k {
12+
while !queue.is_empty() && *queue.back().unwrap() < nums[i] {
13+
queue.pop_back();
14+
}
15+
queue.push_back(nums[i]);
16+
}
17+
res[0] = queue[0];
18+
for i in k..n {
19+
if nums[i - k] == queue[0] {
20+
queue.pop_front();
21+
}
22+
while !queue.is_empty() && *queue.back().unwrap() < nums[i] {
23+
queue.pop_back();
24+
}
25+
queue.push_back(nums[i]);
26+
res[i - k + 1] = queue[0];
27+
}
28+
res
29+
}
30+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
function maxSlidingWindow(nums: number[], k: number): number[] {
2+
const n = nums.length;
3+
const res = [];
4+
if (n === 0 || k === 0) {
5+
return res;
6+
}
7+
const queue = [];
8+
for (let i = 0; i < k; i++) {
9+
while (queue.length !== 0 && queue[queue.length - 1] < nums[i]) {
10+
queue.pop();
11+
}
12+
queue.push(nums[i]);
13+
}
14+
res.push(queue[0]);
15+
for (let i = k; i < n; i++) {
16+
if (queue[0] === nums[i - k]) {
17+
queue.shift();
18+
}
19+
while (queue.length !== 0 && queue[queue.length - 1] < nums[i]) {
20+
queue.pop();
21+
}
22+
queue.push(nums[i]);
23+
res.push(queue[0]);
24+
}
25+
return res;
26+
}

0 commit comments

Comments
 (0)