1,问题描述
227. 基本计算器 II
难度:中等
给你一个字符串表达式 s
,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1]
的范围内。
**注意:**不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()
。
示例 1:
示例 2:
示例 3:
提示:
1 <= s.length <= 3 * 105
s
由整数和算符 ('+', '-', '*', '/')
组成,中间由一些空格隔开
s
表示一个 有效表达式
- 表达式中的所有整数都是非负整数,且在范围
[0, 231 - 1]
内
- 题目数据保证答案是一个 32-bit 整数
2,初步思考
采用stack栈来进行处理,但是自己独立写又要花很多时间去考虑各种情况
看完官方题解瞬间开朗
3,代码处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| import java.util.ArrayDeque; import java.util.Deque;
public class _227基本计算器II {
public int calculate(String s) { Deque<Integer> stack = new ArrayDeque<>(); char preSign = '+'; StringBuilder stringBuilder = new StringBuilder(); char[] charArray = s.toCharArray(); for (int i = 0; i < charArray.length; i++) { if (Character.isDigit(s.charAt(i))) { stringBuilder.append(s.charAt(i)); } if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == charArray.length - 1) { switch (preSign) { case '+': stack.push(Integer.parseInt(stringBuilder.toString())); break; case '-': stack.push(-Integer.parseInt(stringBuilder.toString())); break; case '*': stack.push(stack.poll() * Integer.parseInt(stringBuilder.toString())); break; default: stack.push(stack.poll() / Integer.parseInt(stringBuilder.toString())); } stringBuilder.setLength(0); preSign = s.charAt(i); } } int ans = 0; while (!stack.isEmpty()) { ans += stack.pop(); } return ans; }
public int calculate_gov(String s) { Deque<Integer> stack = new ArrayDeque<Integer>(); char preSign = '+'; int num = 0; int n = s.length(); for (int i = 0; i < n; ++i) { if (Character.isDigit(s.charAt(i))) { num = num * 10 + s.charAt(i) - '0'; } if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n - 1) { switch (preSign) { case '+': stack.push(num); break; case '-': stack.push(-num); break; case '*': stack.push(stack.pop() * num); break; default: stack.push(stack.pop() / num); } preSign = s.charAt(i); num = 0; } } int ans = 0; while (!stack.isEmpty()) { ans += stack.pop(); } return ans; }
public static void main(String[] args) {
System.out.println(new _227基本计算器II().calculate("3+2*2")); } }
|