每日一题系列,保持学习

58 阅读1分钟

题目描述

image.png

image.png

image.png

思路

根据逆波兰表达式的描述,就是将原来算术表达式中的操作符放在数字的右边,理解了这个概念,我们想想该如何计算整个算术表达式?

  1. 从左往右遍历整个数组tokens
  2. 当匹配到操作符时,取出操作符和操作符左边最近的两个数字
  3. 通过eval进行计算得到结果,将结果再放回原数组中
  4. 再次循环进行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)

每日一题,保持编码习惯,加强学习,如有错误,欢迎指正,喜欢的话也方便动动手指点点赞哈