课程名称:2周刷完100道前端优质面试真题
课程章节:第2章 前端面试技能拼图1 :数据结构和算法(上),大厂面试必考
主讲老师:双越
课程内容:
今天学习的内容包括:
2-3 科普-时间复杂度
2-4 科普-空间复杂度
2-7 判断一个字符串是否括号匹配
2-8 用两个栈实现一个队列
这一章主要是讲算法两个度量标准和栈队列链表的算法题,这两题主要还是操作数组。
课程收获:
时间复杂度:程序执行时计算量度量 O(1) < O(logn) < O(n) < O(nlogn) < O(n^2)
空间复杂度:程序执行时需要占用内存度量
-
括号匹配
这个就是利用栈,三中括号一一对应,每个正括号入栈,遇到对应反括号则判断与栈顶是否匹配,匹配则出栈。反括号无法匹配或者最后栈内还有正括号则括号匹配失败。
const isMatchBracket = (str) => {
const l = ['{', '[', '('];
const r = ['}', ']', ')'];
const lTor = {
'{': '}',
'[': ']',
'(': ')'
}
let len = str.length;
let stack = [];
for (let i = 0; i < len; i++) {
let item = str[i];
if (l.includes(item)) {
stack.push(item);
} else if (r.includes(item)){
let head = stack.pop();
if (lTor[head] !== item) {
return false;
}
}
}
return !stack.length
}
console.info(1, isMatchBracket('{a(b[c]d)e}f'));
console.info(2, isMatchBracket('{a}(b[c]d)e}f'));
console.info(3, isMatchBracket('a}(b[c]d)e}f'));
console.info(4, isMatchBracket(''));
-
两个栈拼队列
队列是先进先出,栈先进后出
两个栈拼队列思路:
用两个栈,一个用来入队,入队即入栈;一个用来出队,栈内为空的时候则把第一个栈的出栈元素,入栈到第二个栈,此刻第二个栈的顺序相对于之前的顺序翻转,故第二个栈出栈即为正确的出队顺序。
class Queue {
constructor() {
this.sAppend = [];
this.sDelete = [];
}
append(item) {
this.sAppend.push(item);
}
delete() {
if (!this.sDelete.length) {
while (this.sAppend.length) {
let head = this.sAppend.pop();
this.sDelete.push(head);
}
}
return this.sDelete.pop() ?? -1;
}
}
let q = new Queue();
q.append(100);
// q.append(200);
// q.append(300);
console.log(q.delete());
console.log(q.delete());
以上,结束。