Leetcode 224. 基本计算器,难度:Hard。
原题请戳这里。
题目描述
实现一个基本的计算器来计算一个简单的字符串表达式 s的值。
示例1:
输入:s = "1 + 1"
输出:2
示例2:
输入:s = " 2-1 + 2 "
输出:3
示例3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
提示:
1 <= s.length <= 3 * 10^5s由数字、'+'、'-'、'('、')'、和' '组成s表示一个有效的表达式
思路分析
计算器相关的题目,解决方法一般都和栈有关。
具体做法为:
- 匹配到加减号或加号把符号栈最后一位赋值给sign,减号取反
- 每次匹配到(将当前sign压入符号栈,匹配到)出栈
- 匹配到数字时,循环至一直匹配直到不是数字,res+=当前数字*sign
AC代码
很慢,960ms,主要消耗在提前处理字符串了,其实没必要,用官方解法中的循环时直接判空就行,官方解法110ms
/**
* @param {string} s
* @return {number}
*/
var calculate = function(s) {
const newSArr = s.replace(/\s/g, '').split('');
const n = newSArr.length;
const ops = [1];
let sign = 1;
let res = 0;
let i = 0;
while (i < n) {
if (newSArr[i] === '+') {
sign = ops[ops.length - 1];
i++;
} else if (newSArr[i] === '-') {
sign = -ops[ops.length - 1];
i++;
} else if (newSArr[i] === '(') {
ops.push(sign);
i++;
} else if (newSArr[i] === ')') {
ops.pop();
i++;
} else {
let num = 0;
while (i < n && !(isNaN(Number(newSArr[i])))) {
num = num * 10 + Number(newSArr[i]);
i++;
}
}
}
return res;
};
// 以下是官方题解的解法
var calculate = function(s) {
const ops = [1];
let sign = 1;
let ret = 0;
const n = s.length;
let i = 0;
while (i < n) {
if (s[i] === ' ') {
i++;
} else if (s[i] === '+') {
sign = ops[ops.length - 1];
i++;
} else if (s[i] === '-') {
sign = -ops[ops.length - 1];
i++;
} else if (s[i] === '(') {
ops.push(sign);
i++;
} else if (s[i] === ')') {
ops.pop();
i++;
} else {
let num = 0;
while (i < n && !(isNaN(Number(s[i]))) && s[i] !== ' ') {
num = num * 10 + s[i].charCodeAt() - '0'.charCodeAt();
i++;
}
ret += sign * num;
}
}
return ret;
};
总结
本题相似题目:
用到的技巧
- 计算器相关的题目关键词:双栈、递归+栈、符号、逆波兰表达式。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情