题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
String str = s.replaceAll(" ", "");
char[] cs = str.toCharArray();
int n = str.length();
boolean isFu = false;
// 第一步,处理() 这里有一个负数的处理 如果前面遇到的是 * ,
while (s.contains("(")) {
// 1、找 Last (
int i = s.lastIndexOf("(");
int j;
for (j = i; j < n; j++) {
if (cs[j] == ')') {
break;
}
}
// 说明 i, j是一对() 把中间的内容计算出来并做一个替换。
final int solveValue = solve(s.substring(i + 1, j));
s = s.replace(s.substring(i, j + 1), String.valueOf(solveValue));
str = s.replaceAll(" ", "");
cs = str.toCharArray();
n = str.length();
}
// 第二步,说明所有的 括号都已经改成了数字。准备处理所有乘法。
while (s.contains("*")) {
int i = s.indexOf("*");
int j = i + 1;
// 使用中心扩散
if (cs[j] == '-') {
isFu = true;
j++;
}
int k = i - 1, f = j;
while (k >= 0 && Character.isDigit(cs[k])) {
k--;
}
while (f < s.length() && Character.isDigit(cs[f])) {
f++;
}
// 两个数字的值分别是:
int a = Integer.parseInt(s.substring(k + 1, i));
int b = Integer.parseInt(s.substring(j, f));
if (isFu) {
s = s.replace(s.substring(k + 1, f), String.valueOf(-a * b));
} else {
s = s.replace(s.substring(k + 1, f), String.valueOf(a * b));
}
str = s.replaceAll(" ", "");
cs = str.toCharArray();
n = str.length();
}
str = s.replaceAll("\\+-", "-").replaceAll("--", "+");
cs = str.toCharArray();
n = str.length();
// 最后就只剩下 + - 法,直接使用 遍历,获取到每一个字符,进行计算。
// 如果是遇到数字,则拼接到临时的数字里,如果遇到的是字符,则停止拼接,并转成数字,准备计算。
int ans = 0;
Character ops = '+'; // 当前操作符
String numCurr = "0";
for (int i = 0; i < n; i++) {
if (Character.isDigit(cs[i])) {
numCurr += cs[i];
} else {//说明遇到的是字符了。应该使用 ans加上 操作符,重新计算ans,并重新记录操作符
if (ops == '+') {
ans += Integer.parseInt(numCurr);
} else if (ops == '-') {
ans -= Integer.parseInt(numCurr);
}
ops = cs[i];
numCurr = "";
}
}
if (ops == '+') {
ans += Integer.parseInt(numCurr);
} else if (ops == '-') {
ans -= Integer.parseInt(numCurr);
}
return ans;
}
}
#算法入门#

360集团公司福利 406人发布
查看12道真题和解析