代码随想录Day11-Leetcode20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
20. 有效的括号
写过很多遍了,但还是不能秒a
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let stack = []
let obj = {'(':')', '[':']', '{':'}'}
let map = new Map(Object.entries(obj))
let set = new Set([')',']','}'])
for(let i = 0; i< s.length;i++){
if(map.has(s[i])){
stack.push(map.get(s[i]))
}else if(set.has(s[i])){
if(stack.pop()!=s[i]){
return false
}
}else{
}
}
if(stack.length>0){
return false
}else{
return true
}
};
顺便, 题意中没有写会有其他字母, 其实set没必要
另外, 题解中用嵌套数组创建map,可能更为合理
1047. 删除字符串中的所有相邻重复项
不得不说, 有的简单题出思路才是难的部分,有了思路编码毫无难度;
当然有的刚好相反
/**
* @param {string} s
* @return {string}
*/
//可能一开始直接让我写我会没思路, 但告诉我用栈的时候一下就明白了,这和括号匹配实质上一样的
var removeDuplicates = function(s) {
let stack = []
for(let ch of s){
if(stack.length>0&&stack[stack.length-1] == ch){
stack.pop()
}else{
stack.push(ch)
}
}
return stack.join('')
};
150. 逆波兰表达式求值
这道题我也做过的, 结果还是有点吃力
/**
* @param {string[]} tokens
* @return {number}
*/
var evalRPN = function(tokens) {
let stack = []
let set = new Set(['+','-','*','/'])
for(let i = 0; i< tokens.length;i++){
if(set.has(tokens[i])){
let num1 = stack.pop()
let num2 = stack.pop()
let result = cal(num2,num1,tokens[i])
//一开始写反了
console.log(num2,num1,tokens[i],result)
stack.push(result)
}else{
stack.push(Number(tokens[i]))
}
}
return stack.pop()
};
function cal(l,r,calT){
switch(calT){
case '+':
return l+r
case '-':
return l-r
case '*':
return l*r
case '/':
// let res = l/r
// return res<0?Math.round(res):Math.floor(res)
//这里本应当是Math.ceil,结果我不知道,硬用了parseInt
return parseInt(l/r)
//需要非常小心地处理小数点
default:
console.error("error")
return -1
}
}

浙公网安备 33010602011771号