题目描述
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1]
的范围内。
注意 不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
示例 1:
输入 s = "3+2\*2"
输出 7
示例 2
输入 s = " 3/2 "
输出 1
示例 3:
输入 s = " 3+5 / 2 "
输出 5
提示:
1 <= s.length <= 3 * 105
s
由整数和算符('+', '-', '*', '/')
组成,中间由一些空格隔开s
表示一个 有效表达式- 表达式中的所有整数都是非负整数,且在范围
[0, 231 - 1]
内 - 题目数据保证答案是一个 32-bit 整数
代码
class Solution {
String s;
int i = 0;
ArrayList<Integer> numbers = new ArrayList<>();
ArrayList<Character> operator = new ArrayList<>();
public int calculate(String s) {
this.s = s;
long sum = 0;
for (; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '*') {
while (s.charAt(++i) == ' ');
numbers.add(numbers.get(numbers.size() - 1) * nextNumber());
numbers.remove(numbers.size() - 2);
} else if (ch == '/') {
while (s.charAt(++i) == ' ');
numbers.add(numbers.get(numbers.size() - 1) / nextNumber());
numbers.remove(numbers.size() - 2);
} else if (ch == '+' || ch == '-') {
operator.add(ch);
} else if (Character.isDigit(ch)){
numbers.add(nextNumber());
}
}
int index = 0;
sum = numbers.get(index++);
for (;index < numbers.size(); index++) {
if (operator.get(index - 1) == '+') {
sum += numbers.get(index);
} else {
sum -= numbers.get(index);
}
}
return (int) sum;
}
private int nextNumber() {
int num = s.charAt(i) - '0';
while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1)))
num = num * 10 + s.charAt(++i) - '0';
return num;
}
}
题解
此题很容易想到用栈来解 但我第一想法并不用栈
我的想法是先把 * 和 / 运算全都计算出来
在顺序进行加减法
此题有诸多细节问题, 下面将一一列举
- 整数的读取
我们需要将连在一起的个数字都读取到一块
private int nextNumber() {
int num = s.charAt(i) - '0';
while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1)))
num = num * 10 + s.charAt(++i) - '0';
return num;
}
- 空格的处理
在处理 * 或 / 下一个数字时会存在遇到空格的情况
while (s.charAt(++i) == ' ');
- 当经行了一次乘除计算之后需要把指针后移
numbers.remove(numbers.size() - 2);
具体代码参上
好的!本次分享到这就结束了
如果对铁汁你有帮助的话,记得点赞👍+收藏⭐️+关注➕
我在这先行拜谢了:)