LeetCode 227 基本计算器 II

134 阅读1分钟

参加了 kkb 的门徒培训,想要记录下自己的成长过程。每天一篇,坚持不断更 --- 2022.3.27

题目描述

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

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

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

注意: 不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

 

示例 1:

输入: s = "3+2*2"
输出: 7

示例 2:

输入: s = " 3/2 "
输出: 1

示例 3:

输入: s = " 3+5 / 2 "
输出: 5

 

提示:

  • 1 <= s.length <= 3 * 105
  • s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
  • 题目数据保证答案是一个 32-bit 整数

解题思路

遍历将字符串转成对应的数字,在通过最后求和得出

/**
 * @param {string} s
 * @return {number}
 */
var calculate = function (s) {
  // 配置字符遍历结束符
  s += "#";
  // num 记录当前数字, sta 保存当前数字, lastOp 数字前符号
  let num = 0,
    sta = [],
    lastOp = "+";

  for (let str of s) {
    if (str === " ") continue;
    else if (!isNaN(+str)) {
      num = num * 10 + (+str);
    } else {
      // 判断数字前符号对数字进行操作
      if (lastOp === "+") sta.push(num);
      else if (lastOp === "-") sta.push(-num);
      else if (lastOp === "*") sta.push(sta.pop() * num);
      // 将数字转换为整数(测试用例除法会有问题,这里采用官方做法)
      else if (lastOp === "/") sta.push((sta.pop() / num) | 0);
      num = 0;
      lastOp = str;
    }
  }

  // 计算数组合
  const ans = sta.reduce((pre, next) => pre + next, 0);
  return ans;
};