20210311 LeetCode 每日一题,冲!|刷题打卡

136 阅读1分钟

题目描述

Leetcode 链接:227. 基本计算器 II(medium)

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

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

示例:

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

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

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

提示:

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

JavaScript 模板:

/**
 * @param {string} s
 * @return {number}
 */
var calculate = function (s) {

};

思路分析

这道题我的思路是维护一个栈,用于储存出现的数字,在遇到符号进行运算。

具体思路是:

  • 遍历字符串 s 中每一个字符 char,若其为空格,则不做任何事情
  • 若为数字,则暂时保存在一个变量 num 中
  • 若为运算符号,则根据符号来对 num 进行运算后,存入栈中;然后重置 num 为 0,并且更新运算符号

时间复杂度为 O(n),遍历一个字符串 s

空间复杂度为 O(n),用于维护储存数字的栈

具体代码如下:

var calculate = function (s) {
  s += "+";
  let stack = [], sign = "+",num = 0;
  for (char of s) {
    if (char !== " ") {
      if (!isNaN(char - 0)) {
        num = char - 0 + num * 10;
      } else {
        switch (sign) {
          case "+": {
            stack.push(num);
            break;
          }
          case "-": {
            stack.push(-num);
            break;
          }
          case "*": {
            stack.push(stack.pop() * num);
            break;
          }
          case "/": {
            stack.push((stack.pop() / num) | 0);
            break;
          }
        }
        sign = char;
        num = 0;
      }
    }
  }
  return stack.reduce((a, b) => a + b);
};

总结一下