题目描述
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);
};
总结一下
-
小伙伴们一起来用 JavaScript 刷算法吧:LeetCode-JavaScript
-
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情