提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
1441. 用栈操作构建数组
题目链接
思路
- 给定一个单调递增数组
- 将所有元素映射到数组中
- 将每个数入栈,如果这个数不再刚才的哈希表中出栈就可以了
题解
function buildArray(target: number[], n: number): string[] {
const ans: string[] = []
let j: number = 0
for (let i = 1; i <= n; i++) {
if (j == target.length) {
return ans
}
ans.push("Push")
if (i != target[j]) {
ans.push("Pop")
} else {
j++
}
}
return ans
};
1021. 删除最外层的括号
题目链接
思路
判断入栈前栈是否为空,为空且当前符号为(
则将(
入栈
如果遇到右括号,弹出,如果弹出后栈不为空说明是内层括号
题解
function removeOuterParentheses(s: string): string {
const res = [];
const stack = [];
for (let i = 0; i < s.length; i++) {
// 如果入栈前栈为空,则即将入栈的 “(” 就是最外层左括号。
if (s[i] === '(' && stack.length === 0) {
stack.push('(');
// 如果入栈前栈不为空,则即将入栈的 “(” 就是内层左括号。push进res中
} else if (s[i] === '(' && stack.length !== 0) {
stack.push('(');
res.push('(');
}
// 遇到右括号,弹出。如果弹出后栈不为空,说明是内层括号,push进res中
if (s[i] === ')') {
stack.pop();
if (stack.length !== 0) {
res.push(')')
}
}
}
return res.join('')
};
1700. 无法吃午餐的学生数量
题目链接
思路
- 判断如果学生与三明治一样,直接拿走,两边都删掉第一个
- 否则需要判断一下还有没有要这个三明治的学生了
- 判断是否有人想到,没人想要直接返回结果
- 有人想要把这个人删掉,后边人都放在前面
题解
function countStudents(students: number[], sandwiches: number[]): number {
while (students.length || sandwiches.length) {
if (students[0] === sandwiches[0]) {
students.shift()
} else {
let next = students.findIndex(item => item === 1 - students[0])
if (next === -1) {
return students.length
} else {
students = students.slice(next + 1).concat(students.slice(0, next))
}
}
sandwiches.shift()
}
return 0
};
1381. 设计一个支持增量操作的栈
题目链接
题解
class CustomStack {
stack: number[]
top: number = 0
size = 0
constructor(maxSize: number) {
this.stack = new Array(maxSize + 1).fill(0)
this.size = maxSize
this.top = 0
}
push(x: number): void {
if (this.top < this.size) this.stack[this.top++] = x
}
pop(): number {
if (this.top == 0) return -1
return this.stack[--this.top]
}
increment(k: number, val: number): void {
for (let i = 0; i < k && i < this.top; i++) {
this.stack[i] += val
}
}
}