题目来源:https://leetcode-cn.com/problems/basic-calculator/
题目描述
实现一个基本的计算器来计算一个简单的字符串表达式 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 * 105
s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成
s 表示一个有效的表达式
题目大意
- 缩短遍历次数的最好办法,就是在遍历的时候对数据就进行处理,因为字符是单个依次读取,所以涉及到连续整数的合并,利用while特性,对满足条件下的i疯狂自增,可以缩短不少的时间
- 维护一个nums栈,nums栈中只会存在1或-1,该栈主要用来保存当遇到括号时,对符号进行临时保存,1则当前数字是正数,-1则当前数字是负数
栈
typedef long long ll;
class Solution {
public:
int calculate(string s) {
stack<int> nums;
int ret = 0, i = 0, len = s.size();
int sign = 1;
// stack<int> nums作为符号位,一开始默认为+1
nums.push(1);
while (i < len){
if (s[i] == ' ')
++i;
else if(s[i] == '+'){
sign = nums.top();
++i;
}
else if(s[i] == '-'){
sign = -1 * nums.top();
++i;
}
else if(s[i] == '('){
nums.push(sign);
++i;
}
else if(s[i] == ')'){
nums.pop();
++i;
}
else{
ll num = 0;
while(i < len && s[i] >= '0' && s[i] <= '9'){
num = num * 10 + s[i] - '0';
++i;
}
ret += sign * num;
}
}
return ret;
}
};
- 官方的题解时间还是比我自个做出来的短啊(感叹)
复杂度分析
- 时间复杂度:O(n)。n为数组的长度
- 空间复杂度:O(n)。n为数组的长度