227. 基本计算器 II
一、题目
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = “3+2*2”
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
二、思路
- 直接模拟,先剔除空格
- 两次循环,模拟先乘除 后加减 简单粗暴
三、代码
import java.util.LinkedList;
import java.util.List;class Solution {public int calculate(String s) {s = s.replaceAll(" ", "");//剔除空格List<String> sList = new ArrayList<>();StringBuilder sb = new StringBuilder();//避免频繁拼接字符串int length = s.length();for (int i = 0; i < length; i++) {char c = s.charAt(i);if (Character.isDigit(c)) {sb.append(c);} else {if (sb.length() > 0) {sList.add(sb.toString());sb.setLength(0);}sList.add(String.valueOf(c));}}if (sb.length() > 0) {sList.add(sb.toString());//最后那个数字}// 处理乘除for (int i = 0; i < sList.size();) {String code = sList.get(i);if (code.equals("*") || code.equals("/")) {// 获取前一个和后一个数字int num1 = Integer.parseInt(sList.get(i - 1));int num2 = Integer.parseInt(sList.get(i + 1));int result;if (code.equals("*")) {result = num1 * num2;} else {result = num1 / num2;}// 替换当前元素为结果,移除前两个元素sList.set(i - 1, String.valueOf(result));sList.remove(i);sList.remove(i);// 回退索引以处理可能的连续运算符i -= 1;} else {i++;}}// 计算加减int sum = Integer.parseInt(sList.get(0));int flag = 1; // 1加2减for (int i = 1; i < sList.size(); i++) {String code = sList.get(i);if (code.equals("+")) {flag = 1;} else if (code.equals("-")) {flag = 2;} else {int num = Integer.parseInt(code);sum = flag == 1 ? sum + num : sum - num;}}return sum;}
}