题目描述
思路
根据逆波兰表达式的描述,就是将原来算术表达式中的操作符放在数字的右边,理解了这个概念,我们想想该如何计算整个算术表达式?
- 从左往右遍历整个数组tokens
- 当匹配到操作符时,取出操作符和操作符左边最近的两个数字
- 通过eval进行计算得到结果,将结果再放回原数组中
- 再次循环进行1-3的步骤
解题过程
数组操作
/**
* @param {string[]} tokens
* @return {number}
*/
var evalRPN = function(tokens) {
let a,b,operate,i=0;
const operateList = ['+','-','*','/'];
let len = tokens.length;
while(len>1){
if(operateList.includes(tokens[i])) {
a=tokens[i-2];
b='('+tokens[i-1]+')';
operate=tokens[i];
const temp = eval(a+operate+b);
let res = '';
if(temp < 0) {
res = Math.ceil(temp);
} else {
res = Math.floor(temp);
}
tokens.splice(i-2,3,res);
len=len-2;
i = i - 2;
} else {
i++;
}
}
return tokens[0];
};
复杂度
- 时间复杂度: O(n2)
- 空间复杂度: O(1)
栈操作
/**
* @param {string[]} tokens
* @return {number}
*/
var evalRPN = function(tokens) {
let a,b,operate,i=0;
const operateList = ['+','-','*','/'];
let len = tokens.length;
let arr = [];
while(i<len){
if(operateList.includes(tokens[i])) {
b='('+arr.pop()+')';
a=arr.pop();
operate=tokens[i];
const temp = eval(a+operate+b);
let res = '';
if(temp < 0) {
res = Math.ceil(temp);
} else {
res = Math.floor(temp);
}
arr.push(res);
} else {
arr.push(tokens[i]);
}
i++;
}
return arr[0];
};
复杂度
- 时间复杂度: O(n)
- 空间复杂度: O(1)
每日一题,保持编码习惯,加强学习,如有错误,欢迎指正,喜欢的话也方便动动手指点点赞哈