Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5bb8434

Browse files
authored
* feat(js-solution): add js-solution for problem 4 * feat(js-solution): add js solution for problem 25 * feat: azl397985856#32 栈解法
1 parent d605b3d commit 5bb8434

File tree

2 files changed

+88
-17
lines changed

2 files changed

+88
-17
lines changed

problems/25.reverse-nodes-in-k-groups-cn.md

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ curr = temp;
6565
![reverse k nodes in linked list](../assets/problems/25.reverse-nodes-in-k-groups-2.PNG)
6666

6767

68-
>**NOTE**: 一般情况下对链表的操作,都有可能会引入一个新的`dummy node`,因为`head`有可能会改变。这里`head 从1->3`,
68+
>**NOTE**: 一般情况下对链表的操作,都有可能会引入一个新的`dummy node`,因为`head`有可能会改变。这里`head 从1->3`,
6969
`dummy (List(0)) `保持不变。
7070

7171
#### 复杂度分析
@@ -78,7 +78,7 @@ curr = temp;
7878
3. 对每一组进行翻转,更换起始和最后的位置
7979
4. 返回`dummy.next`.
8080

81-
## 代码 (`Java/Python3`)
81+
## 代码 (`Java/Python3/javascript`)
8282
*Java Code*
8383
```java
8484
class ReverseKGroupsLinkedList {
@@ -88,7 +88,7 @@ class ReverseKGroupsLinkedList {
8888
}
8989
ListNode dummy = new ListNode(0);
9090
dummy.next = head;
91-
91+
9292
ListNode start = dummy;
9393
ListNode end = head;
9494
int count = 0;
@@ -105,21 +105,21 @@ class ReverseKGroupsLinkedList {
105105
}
106106
return dummy.next;
107107
}
108-
109-
/**
108+
109+
/**
110110
* reverse linked list from range (start, end), return last node.
111-
* for example:
111+
* for example:
112112
* 0->1->2->3->4->5->6->7->8
113113
* | |
114114
* start end
115-
*
115+
*
116116
* After call start = reverse(start, end)
117-
*
117+
*
118118
* 0->3->2->1->4->5->6->7->8
119119
* | |
120120
* start end
121121
* first
122-
*
122+
*
123123
*/
124124
private ListNode reverse(ListNode start, ListNode end) {
125125
ListNode curr = start.next;
@@ -157,7 +157,7 @@ class Solution:
157157
else:
158158
end = end.next
159159
return dummy.next
160-
160+
161161
def reverse(self, start, end):
162162
prev, curr = start, start.next
163163
first = curr
@@ -168,7 +168,49 @@ class Solution:
168168
curr = temp
169169
start.next = prev
170170
first.next = curr
171-
return first
171+
return first
172+
```
173+
174+
*javascript code*
175+
```js
176+
/**
177+
* @param {ListNode} head
178+
* @param {number} k
179+
* @return {ListNode}
180+
*/
181+
var reverseKGroup = function(head, k) {
182+
// 标兵
183+
let dummy = new ListNode()
184+
dummy.next = head
185+
let [start, end] = [dummy, dummy.next]
186+
let count = 0
187+
while(end) {
188+
count++
189+
if (count % k === 0) {
190+
start = reverseList(start, end.next)
191+
end = start.next
192+
} else {
193+
end = end.next
194+
}
195+
}
196+
return dummy.next
197+
198+
// 翻转stat -> end的链表
199+
function reverseList(start, end) {
200+
let [pre, cur] = [start, start.next]
201+
const first = cur
202+
while(cur !== end) {
203+
let next = cur.next
204+
cur.next = pre
205+
pre = cur
206+
cur = next
207+
}
208+
start.next = pre
209+
first.next = cur
210+
return first
211+
}
212+
};
213+
172214
```
173215

174216
## 参考(References)
@@ -178,13 +220,13 @@ class Solution:
178220

179221
- 要求从后往前以`k`个为一组进行翻转。**(字节跳动(ByteDance)面试题)**
180222

181-
例子,`1->2->3->4->5->6->7->8, k = 3`,
182-
223+
例子,`1->2->3->4->5->6->7->8, k = 3`,
224+
183225
从后往前以`k=3`为一组,
184-
- `6->7->8` 为一组翻转为`8->7->6`
185-
- `3->4->5`为一组翻转为`5->4->3`.
226+
- `6->7->8` 为一组翻转为`8->7->6`
227+
- `3->4->5`为一组翻转为`5->4->3`.
186228
- `1->2`只有2个nodes少于`k=3`个,不翻转。
187-
229+
188230
最后返回: `1->2->5->4->3->8->7->6`
189231

190232
这里的思路跟从前往后以`k`个为一组进行翻转类似,可以进行预处理:

problems/32.longest-valid-parentheses.md

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,15 @@ s = '(())())'
4444
1. 第3点特征, 需要检查的字符是s[i-1]和s[i-2-dp[i-1]], 根据定义可知: i-1 >= dp[i-1], 但是i-2不一定大于dp[i-1], 因此, 需要检查越界;
4545
3. 第4点特征最容易遗漏, 还有就是不需要检查越界, 因为根据定义可知: i >= dp[i], 所以dp[i-dp[i]]的边界情况是dp[0];
4646

47+
## 思路(栈)
48+
主要思路和常规的括号解法一样,遇到'('入栈,遇到')'出栈,并计算两个括号之间的长度。
49+
因为这个题存在非法括号对的情况且求是合法括号对的最大长度 所以有两个注意点是:
50+
1. **栈中存的是符号的下标**
51+
2. **当栈为空时且当前扫描到的符号是')'时,需要将这个符号入栈作为分割符**
52+
4753
## 代码
4854

49-
* 语言支持: Python
55+
* 语言支持: Python, javascript
5056

5157
Python Code:
5258
```
@@ -75,6 +81,29 @@ class Solution:
7581
return mlen
7682
```
7783

84+
javascript code:
85+
```js
86+
// 用栈来解
87+
var longestValidParentheses = function(s) {
88+
let stack = new Array()
89+
let longest = 0
90+
stack.push(-1)
91+
for(let i = 0; i < s.length; i++) {
92+
if (s[i] === '(') {
93+
stack.push(i)
94+
} else {
95+
stack.pop()
96+
if (stack.length === 0) {
97+
stack.push(i)
98+
} else {
99+
longest = Math.max(longest, i - stack[stack.length - 1])
100+
}
101+
}
102+
}
103+
return longest
104+
};
105+
```
106+
78107
## 扩展
79108

80109
1. 如果判断的不仅仅只有'('和')', 还有'[', ']', '{'和'}', 该怎么办?

0 commit comments

Comments
 (0)