【LeetCode】227. 基本计算器 II(同NC137)
作者:互联网
一、题目
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = "3+2*2"
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
提示:
- 1 < = s . l e n g t h < = 3 ∗ 1 0 5 1 <= s.length <= 3 * 10^5 1<=s.length<=3∗105
- s 由整数和算符
('+', '-', '*', '/')
组成,中间由一些空格隔开 - s 表示一个 有效表达式
- 表达式中的所有整数都是非负整数,且在范围
[
0
,
2
31
−
1
]
[0, 2^{31} - 1]
[0,231−1] 内
题目数据保证答案是一个 32-bit 整数
二、解决
1、栈
思路:
栈的进出主要看运算符的优先级,遇到连续正常数字就乘10加数,遇到“+ or -
”符号就入栈,遇到"* or /
"就进行计算。最后再出栈算总和。
代码:
class Solution {
public int calculate(String s) {
if (s == null || s.length() == 0) return 0;
Stack<Integer> stack = new Stack<>();
s += '+';
char op = '+';
for (int i = 0, n = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') { n = n * 10 + c - '0'; continue; }
if (c == ' ') continue;
if (op == '+') stack.push(n);
else if (op == '-') stack.push(-n);
else if (op == '*') stack.push(stack.pop()*n);
else if (op == '/') stack.push(stack.pop()/n);
op = c;
n = 0;
}
int total = 0;
while (!stack.isEmpty()) total += stack.pop();
return total;
}
}
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
n
)
O(n)
O(n)
2、迭代求和
思路:
pre记录之前加总和,curr记录当下遍历位置的数,最后返回两者加总即可。
代码:
class Solution {
public int calculate(String s) {
int pre = 0, curr = 0, sign = 1, op = 0, num = 0;
for (int i = 0; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i))) {
num = num * 10 + (s.charAt(i) - '0');
if (i == s.length() - 1 || !Character.isDigit(s.charAt(i + 1))) {
curr = (op == 0 ? num : (op == 1 ? curr * num : curr / num));
}
} else if (s.charAt(i) == '*' || s.charAt(i) == '/') {
op = (s.charAt(i) == '*' ? 1 : -1);
num = 0;
} else if (s.charAt(i) == '+' || s.charAt(i) == '-') {
pre += sign * curr;
sign = (s.charAt(i) == '+' ? 1 : -1);
op = 0;
num = 0;
}
}
return pre + sign * curr;
}
}
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
补充:
1、Character.isDigit(c):判断字符c是否为数字。
if yes, return true;
else return false
三、参考
1、Share my java solution
2、Java straight forward iteration Solution with comments, No Stack, O(N) & O(1)
3、Explanation for Java O(n) time & O(1) space solution
4、【宫水三叶】使用「双栈」解决「究极表达式计算」问题
标签:curr,charAt,int,II,num,NC137,227,return,op 来源: https://blog.csdn.net/HeavenDan/article/details/117219220