[路飞]_leetcode 227. 基本计算器 II JavaScript版

717 阅读2分钟

「这是我参与11月更文挑战的第 21 天,活动详情查看:2021最后一次更文挑战

题目来源:leetcode 227. 基本计算器 II

题目

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

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

示例 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 整数

题解

提出问题

  • 如何取除字符串s中的空格?
  • 如何读取数字?
  • 如何先乘除在加减?

分析

  • 从题目中可以看处,字符串s中有数字、运算符、空格,在计算的过程中可以利用stack

  • 可以通过s = s.replace(/\s+/g,"")取除字符串s中所以空格

  • 可以通过遍历字符串s利用num = num * 10 + Number(s[i])得到数字

  • 加法stack.push(num)

  • 减法stack.push(-num)

  • 乘法stack.push(stack.pop() * num)

  • 除法stack.push(stack.pop() / num | 0)

  • 假设s = " 3+5 / 2 " ,定义stack栈与`

  • 通过s = s.replace(/\s+/g,"")取除字符串s中所有的空格

  • 开始遍历s ,判断当前是否是数字如果是num = num * 10 + Number(s[i])

  • 不是的话说明是运算符此时判断是哪一种运算符

  • 如果是加法的话直接往stack.push(num)

  • 如果是减法的话直接往stack.push(-num)

  • 如果是乘法的话由于需要计算出结果stack.push(stack.pop() * num)

  • 如果是除法的话由于需要计算出结果stack.push(stack.pop() / num | 0)

  • 当执行完对应运算符结果时需要将num重新赋值成0

  • 重复执行上述操作stack中的元素相加并返回结果

代码实现

/**
 * @param {string} s
 * @return {number}
 */
var calculate = function (s) {
    s = s.replace(/\s+/g,"");
    let stack = new Array()
    let preSign = "+"
    let num = 0
    let n = s.length
    for (let i = 0; i < n; i++) {
        if (!isNaN(Number(s[i]))) {
            num = num * 10 + Number(s[i])
        }
        if (isNaN(Number(s[i])) || i === n - 1) {
            switch (preSign) {
                case "+":
                    stack.push(num)
                    break
                case "-":
                    stack.push(-num)
                    break
                case "*":
                    stack.push(stack.pop() * num)
                    break
                default:
                    stack.push(stack.pop() / num | 0)
                    break
            }
            preSign = s[i]
            num = 0
        }
    }
    let ans = 0
    while (stack.length) {
        ans += stack.pop()
    }
    return ans
};