[路飞]_算法·每日解读--基本计算器Ⅱ

413 阅读2分钟

题解227: 基本计算器 II

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例:

@param {string} s
@return {number}
输入:s = "3+2*2"
输出:7

思路解读:

  • 题中指定的输入类型为String类型,而输出类型为number类型
  • 基于题意,①需要进行字符串拆分查找确定运算符;②判断运算的优先级,进行相应运算
  • 细节化处理,①将数字类型字符转换成数字(注意多位数字的操作);②非数字字符将其存入栈中,符号跟随(当为减运算时,将 num-num 的形式存入栈中
  • 应用到的方法:数组类栈操作(push,pop)、trim()reduce()
var calculate = function (s) {
  s = s.trim();         //从一个字符串的两端删除空白字符,去除空格操作
  let stack = new Array();      //实例化一个数组对象,作为栈来存取接下来获得的数据
  let preSign = '+';        //定义一个参数用于存储拆分后获得的运算符
  let num = 0;      //值保存,包括计算后的和拆分后的
  for (let i = 0; i < s.length; i++) {      //循环遍历,遍历的过程中进行数和符号的辨识
    if (!isNaN(s[i]) && s[i] !== ' ') {//s[i]是一个数字且不为空时,(Not-a-Number)
        // 处理多位数
      num = num * 10 + Number(s[i]);    //将其转换成数字
    }
    if (isNaN(s[i]) || i == s.length - 1) { //isNaN 确定值 是否为非数字
      switch (preSign) {        //判断符号匹配,在这里只需要着重思考乘和除的运算
                                //全部转换为加运算
        case '+':       //preSign预定义为+,所以第一个数字肯定push进去
          stack.push(num);
          break;
        case '-':
          stack.push(-num);
          break;
        case '*':
          stack.push(stack.pop() * num);//将前一个push进去的num吐出来和当前的num进行乘运算后再push进去
          break;
        default:
          stack.push((stack.pop() / num) | 0);//除法运算同上,直接进行除运算,|0进行位运算取整操作
          break;
      }
      preSign = s[i];   //改变当前的preSign
      num = 0;          //重置num
    }
  }
  return stack.reduce((a, b) => a + b);     //reduce函数(最后将每个元素执行相加函数运算)reduce进行函数累加器
};

知识点回顾:

字符串操作方法和属性==》

  1. trim()方法

  2. reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

    reduce() 可以作为一个高阶函数,用于函数的 compose。

    注意: reduce() 对于空数组是不会执行回调函数的。

变量的定义是根据函数逻辑实现的过程中有所需时进行创建的,不需要进行提前思量

👆 👆 以上就是个人对【基本运算器Ⅱ】的代码解法和方法解读。

迷惑重重,一看上头,一键三连哟!!!

完成代码请移步: 稍后添加