今日学习
有效的括号
题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html
第一想法
将左括号转化为入栈,如果遇到右括号与pop对比,不相等直接false,相等之后继续对比
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
let st = []
if (s.length % 2 == 1) {
return false
}
for (const i of s) {
if (i === "[") {
st.push("]")
}
else if (i === "{") {
st.push("}")
}
else if (i === "(") {
st.push(")")
}
else if (i !== st.pop()) {
return false
}
}
return st.length === 0
};
删除字符串中的所有相邻重复项
第一想法
有点像消消乐
/**
* @param {string} s
* @return {string}
*/
var removeDuplicates = function(s) {
let st = []
for (const i of s){
if(st.length > 0 && st[st.length - 1] === i){
st.pop()
}else{
st.push(i)
}
}
return st.join('')
};
逆波兰表达式求值
题目链接/文章讲解/视频讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html
第一想法
主要是理解了逆波兰表达式,当是数值是入栈,当是加减乘除时,取顶上两个数进行计算,最后取唯一一个数值
/**
* @param {string[]} tokens
* @return {number}
*/
var evalRPN = function(tokens) {
let stack = []
for(const token of tokens){
if (isNaN(Number(token))) { // 非数字
const n2 = stack.pop(); // 出栈两个数字
const n1 = stack.pop();
switch (token) { // 判断运算符类型,算出新数入栈
case "+":
stack.push(n1 + n2);
break;
case "-":
stack.push(n1 - n2);
break;
case "*":
stack.push(n1 * n2);
break;
case "/":
stack.push(n1 / n2 | 0);
break;
}
} else { // 数字
stack.push(Number(token));
}
}
return stack[0]
};