/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
//定义三个栈
let s1=new Array()
for(let i=0;i<s.length;i++){
if(s[i]==='(')
s1.push('(')
if(s[i]===')'){
if(s1.pop()!=='(')
return false
}
if(s[i]==='{')
s1.push('{')
if(s[i]==='}'){
if(s1.pop()!=='{')
return false
}
if(s[i]==='[')
s1.push('[')
if(s[i]===']'){
if(s1.pop()!=='[')
return false
}
}
if(s1.length!==0)
return false
return true
};
//随想录简化版本
var isValid = function(s) {
const stack = [],
map = {
"(":")",
"{":"}",
"[":"]"
};
for(const x of s) {
if(x in map) {
stack.push(x);
continue;
};
if(map[stack.pop()] !== x) return false;
}
return !stack.length;
};
第一想法
栈的思想,后入先出,有(入栈,出现)出栈,如果弹出的是其他,就false。
最后栈里的东西没清完,也是false
困难
- 题意,开始的代码"[(])",这个通过不了
收获
- 思想:一对一对应的(‘【’‘】’),用map
/**
* @param {string} s
* @return {string}
*/
var removeDuplicates = function(s) {
let st=[]
let n=s.length
st.push(s[0])
for(let i=1;i<n;i++ ){
let x=st.pop()
if(s[i]!==x)
{
st.push(x)
st.push(s[i])
}
}
return st.join('')
};
第一想法
思想和上一题一样,栈,相同弹出,不相同push
/**
* @param {string[]} tokens
* @return {number}
*/
var evalRPN = function (tokens) {
let number = []
for (let i = 0; i < tokens.length; i++) {
if (!isNaN(parseFloat(tokens[i]))) {
number.push(parseFloat(tokens[i]))
}
else {
let c = tokens[i]
switch (c) {
case "*":
number.push(number.pop() * number.pop())
break
case "/":
let v = number.pop()
number.push(~~(number.pop() / v))
break
case "+":
number.push(number.pop() + number.pop())
break
default:
let v1 = number.pop()
number.push(number.pop() - v1)
}
}
}
return number.pop()
};
第一想法
数值栈,遇上非数值 number.push(number.pop() ? number.pop())运算。
遇上数值,push()
困难
- 字符串转数字,判断是否为数字等基本用法
收获
- 字符串转数值 了解更多
if (!isNaN(parseFloat(tokens[i]))) {
number.push(parseFloat(tokens[i]))
}
- swich用法
switch © {
case “*”:
number.push(number.pop() * number.pop())
break
case “/”:
let v = number.pop()
number.push(~~(number.pop() / v))
break
case “+”:
number.push(number.pop() + number.pop())
break
default:
let v1 = number.pop()
number.push(number.pop() - v1)
}