题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d
调了很多次,每次调完,会增加两三条用例通过。。。好歹全部调通过了。很开心呵呵。
(如果考试的时候,不能用javax去执行js的话,建议写个只计算加减的,多少得点分算了,其他用例还是放弃的好)
import java.util.*;
import java.lang.*;
// 思路:先把括号中的取出来作为子表达式计算-->将计算结果转化为字符串替换原来的这段括号内的字符串
//写子表达式的计算方法,先算/,*,再算+,-
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String a = in.nextLine();
char[] ac = a.toCharArray();
String s = a;
int out = 0;
Main m = new Main();
while (s.contains("(")) {
int kuol = s.lastIndexOf("(");//从最内层括号开始取
int kuor = s.indexOf(")",
kuol); //从后边取离该左括号最近的一个右括号
String sub1 = s.substring(kuol + 1, kuor);
int si = m.evalc(sub1);
String sis = "";
String sl = s.substring(0, kuol);
int iii = Math.max(sl.lastIndexOf("+"), sl.lastIndexOf("-"));
//当括号内计算结果为负数时要把负号前移至左边离它最近的一个加号或减号上
if (si < 0 &&
sl.length() >
0) { //当sl长度==0时证明负号已经是最左边了,就不要再前移了
if (sl.charAt(iii) == '+') {
sl = sl.substring(0, iii) + "-" + sl.substring(iii + 1);
} else if (sl.charAt(iii) == '-') {
sl = sl.substring(0, iii) + "+" + sl.substring(iii + 1);
}
sis = String.valueOf(si * (-1));
} else {
sis = String.valueOf(si);
}
//根据括号内计算结果重新拼接替换原字符串:s=左边的子串+计算结果+右边的子串
if (kuor < s.length() - 1) {
s = sl + sis + s.substring(kuor + 1);
} else if (kuor == s.length() - 1) { //当右括号在最字符串最右边时
s = sl + sis;
}
}
out = m.evalc(s);
System.out.println(out);
}
}
public int evalc(String s) {
if (s.charAt(0) == '-' || s.charAt(0) == '+') {
s = "0" + s; //当表达式首位为+-号时在左边拼个0
}
//计算/并拼接结果
while (s.contains("/")) {
int k = s.indexOf("/");
int r = 0, l = 0;
String sr = "", sl = "";
for (int i = k + 1; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i))) {
sr = sr + Character.toString(s.charAt(i));
r = i;
break;
} else {
break;
}
}
for (int i = k - 1; i >= 0; i--) {
if (Character.isDigit(s.charAt(i))) {
sl = Character.toString(s.charAt(i)) + sl;
l = i;
} else {
break;
}
}
int subres = Integer.parseInt(sl) / Integer.parseInt(sr);
if (r == s.length() - 1) {
s = s.substring(0, l) + String.valueOf(subres);
} else {
s = s.substring(0, l) + String.valueOf(subres) + s.substring(r + 1);
}
}
//计算*并拼接结果
while (s.contains("*")) {
int k = s.indexOf("*");
int r = 0, l = 0;
String sr = "", sl = "";
for (int i = k + 1; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i))) {
sr = sr + Character.toString(s.charAt(i));
r = i;
} else {
break;
}
}
for (int i = k - 1; i >= 0; i--) {
if (Character.isDigit(s.charAt(i))) {
sl = Character.toString(s.charAt(i)) + sl;
l = i;
} else {
break;
}
}
int subres = Integer.parseInt(sl) * Integer.parseInt(sr);
if (r == s.length() - 1) {
s = s.substring(0, l) + String.valueOf(subres);
} else {
s = s.substring(0, l) + String.valueOf(subres) + s.substring(r + 1);
}
}
//计算加减并返回结果
String a0[] = s.replaceAll("[^0-9]", " ").trim().split(" ");
String aa[] = s.replaceAll("[0-9]+", "").split("");
int out = Integer.parseInt(a0[0]);
for (int b = 0; b < aa.length; b++) {
if (aa[b].equals("+")) {
out += Integer.parseInt(a0[b + 1]);
} else if (aa[b].equals("-")) {
out -= Integer.parseInt(a0[b + 1]);
} else {
continue;
}
}
return out;
}
}

