题目描述
给你一个字符串表达式 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);
具体代码参上
好的!本次分享到这就结束了
如果对铁汁你有帮助的话,记得点赞👍+收藏⭐️+关注➕
我在这先行拜谢了:)
原题链接