题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input = in.next();
//先计算小括号->中括号->大括号
//先计算*/ 再计算+-
System.out.println(substring(input));
}
//按顺序去除括号
private static String substring(String s) {
//寻找小括号,注意倒序查找
int i1 = -1;
int i2 = s.indexOf(")");
if (i2 != -1) {
for (int i = i2 - 1; i >= 0; i--) {
if (s.charAt(i) == '(') {
i1 = i;
break;
}
}
}
if (i1 != -1) {
i2 = s.indexOf(")");
String substring = s.substring(i1 + 1, i2);
s = s.substring(0, i1) + simplify(substring) + s.substring(i2 + 1);
s = substring(s);
}
//寻找中括号
i1 = s.indexOf("[");
if (i1 != -1) {
i2 = s.indexOf("]");
String substring = s.substring(i1 + 1, i2);
s = s.substring(0, i1) + simplify(substring) + s.substring(i2 + 1);
s = substring(s);
}
//寻找大括号
i1 = s.indexOf("{");
if (i1 != -1) {
i2 = s.indexOf("}");
String substring = s.substring(i1 + 1, i2);
s = s.substring(0, i1) + simplify(substring) + s.substring(i2 + 1);
s = substring(s);
}
//没有括号了
return simplify(s);
}
//括号内计算
private static String simplify(String s) {
//先查找*/
int i1 = s.indexOf("*");
int i2 = s.indexOf("/");
int index = (i1 != -1 && i2 != -1) ? Math.min(i1, i2) : Math.max(i1, i2);
if (index != -1) {
return extracted(s, index);
}
//再查找+-
i1 = s.indexOf("+");
if (s.indexOf("-") == 0) {//排除负号
int indexOf = s.substring(1).indexOf("-");
i2 = indexOf == -1 ? -1 : indexOf + 1;
} else {
i2 = s.indexOf("-");
}
index = (i1 != -1 && i2 != -1) ? Math.min(i1, i2) : Math.max(i1, i2);
if (index != -1) {
return extracted(s, index);
}
return s;
}
private static String extracted(String s, int index) {
int index2 = -1;//上一个非运算符位置
for (int i = index - 1; i > 0; i--) {
if (s.charAt(i) > '9' || s.charAt(i) < '0') {
index2 = i;
break;
}
}
int index3 = s.length();//下一个非运算符位置
for (int i = index + 2; i < s.length(); i++) {//注意负号
if (s.charAt(i) > '9' || s.charAt(i) < '0') {
index3 = i;
break;
}
}
//截取可运行部分
String s2 = compute(s.substring(index2 + 1, index3));
String s1 = index2 == -1 ? "" : s.substring(0, index2 + 1);
String s3 = s.substring(index3);
s = s1 + s2 + s3;
return simplify(s);
}
private static String compute(String s) {
//找到第一个运算符位置
int index = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) > '9' || s.charAt(i) < '0') {
if (i != 0) {//排除负号
index = i;
break;
}
}
}
//获得运算符合数字
int result = 0;
int i = Integer.parseInt(s.substring(0, index));
int j = Integer.parseInt(s.substring(index + 1));
char c = s.charAt(index);
switch (c) {
case '+':
result = i + j;
break;
case '-':
result = i - j;
break;
case '*':
result = i * j;
break;
case '/':
result = i / j;
break;
}
return String.valueOf(result);
}
}
解题思路:
1, 需要注意四则运算的规则, 先计算括号内, 再计算括号外的部分;
2,括号内先计算乘除法, 再处理加减法;
3, 读取运算符时注意避开负号
韶音科技公司氛围 665人发布