LeetCode 224. 基本计算器
题目描述
思路分析
解法一:栈 + 符号累积(推荐)
核心思路:
- 从左到右扫描,数字部分累积成
num。- 使用
sign表示当前数字的符号,res表示当前括号内的结果。- 遇到
(时,将当前res与sign入栈,重置进入新子表达式。- 遇到
)时,先把当前num结算到res,再与栈顶结果合并。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示字符串长度。
- 空间复杂度:O(n),栈存储括号上下文。
import java.util.*;
class Solution {
public int calculate(String s) {
Deque<Integer> stack = new ArrayDeque<>();
int res = 0;
int num = 0;
int sign = 1;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') {
num = num * 10 + (c - '0');
} else if (c == '+') {
res += sign * num;
num = 0;
sign = 1;
} else if (c == '-') {
res += sign * num;
num = 0;
sign = -1;
} else if (c == '(') {
stack.push(res);
stack.push(sign);
res = 0;
sign = 1;
} else if (c == ')') {
res += sign * num;
num = 0;
res *= stack.pop();
res += stack.pop();
}
}
res += sign * num;
return res;
}
}
func calculate(s string) int {
stack := make([]int, 0)
res := 0
num := 0
sign := 1
for i := 0; i < len(s); i++ {
c := s[i]
if c >= '0' && c <= '9' {
num = num*10 + int(c-'0')
continue
}
if c == '+' {
res += sign * num
num = 0
sign = 1
} else if c == '-' {
res += sign * num
num = 0
sign = -1
} else if c == '(' {
stack = append(stack, res)
stack = append(stack, sign)
res = 0
sign = 1
} else if c == ')' {
res += sign * num
num = 0
sign = stack[len(stack)-1]
stack = stack[:len(stack)-1]
prev := stack[len(stack)-1]
stack = stack[:len(stack)-1]
res = prev + sign*res
}
}
res += sign * num
return res
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 227. 基本计算器 II | 中等 | 栈、模拟 |
| 772. 基本计算器 III | 困难 | 栈、模拟 |
| 150. 逆波兰表达式求值 | 中等 | 栈 |
| 224. 基本计算器 | 困难 | 栈、模拟 |
| 394. 字符串解码 | 中等 | 栈、模拟 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!