- 時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(n)
- Runtime: 96 ms, faster than 62.50%
- Memory Usage: 48.1 MB, less than 8.93%
類(lèi)似加減乘除的計(jì)算方式橘沥,對(duì)括號(hào)里面的內(nèi)容進(jìn)行遞歸。parseInt在遇到非常小的數(shù)字的時(shí)候會(huì)出現(xiàn)不符合預(yù)期的異常情況苹丸,換成 |0
/**
* @param {string} s
* @return {number}
*/
var calculate = function(s) {
while(s.indexOf(')') > 0) {
let end = s.indexOf(')');
let start = s.substring(0, end).lastIndexOf('(');
let cur = help(s.substring(start + 1, end));
s = s.substring(0, start) + cur + s.substring(end + 1);
}
return help(s);
};
var help = function(s) {
s = s.replace(/\s/g, '');
let sign = '+';
let stack = [];
let res = 0;
let len = s.length;
let num = 0;
let prev = ''
for (let i = 0; i < len; i++) {
let start = i;
while (/[0-9]/.test(s[i]) || /[*/+-]/.test(s[i - 1]) && s[i] === '-') {
i++;
}
const num = s.substring(start, i) - '0';
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 = s[i];
}
while (stack.length) {
res += stack.pop();
}
return res + '';
};