参加了 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 * 105s由整数和算符('+', '-', '*', '/')组成,中间由一些空格隔开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;
};