题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
Stack<Integer> stack = new Stack<>();
for ( int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(') {
stack.push(i);
}
}
if (stack.isEmpty()) {
return computeResult(s);
}
StringBuilder builder = new StringBuilder(s);
while (!stack.isEmpty()) {
Integer pop = stack.pop();
int index = pop;
int indexOf = builder.indexOf(")", index);
String substring = builder.substring(index + 1, indexOf);
if (substring.length() > 0) {
int compute = computeResult(substring);
builder.replace(index, indexOf + 1, compute + "");
} else {
builder.replace(index + 1, indexOf, substring);
}
}
return computeResult(builder.toString());
}
public int computeResult(String s) {
List<Object> arr = new ArrayList<>();
compute(s, 0, arr);
Integer res = null;
Character reg = null;
for (Object ite : arr) {
if (ite instanceof Integer) {
if (reg == null) {
res = (Integer) ite;
} else {
if ('-' == reg) {
res = res - (Integer) ite;
} else {
res = res + (Integer) ite;
}
}
}
if (ite instanceof Character) {
reg = (Character) ite;
}
}
return res;
}
public void compute (String s, int index, List<Object> arr) {
int curri = index;
StringBuilder numpar = new StringBuilder();
List<Character> regres = new ArrayList<Character>() {
{
add('+');
add('-');
add('*');
}
};
while ( curri < s.length() && (!regres.contains(s.charAt(curri))
|| ('-' == s.charAt(curri) && (curri == 0))
|| regres.contains(s.charAt(curri - 1)) )) {
numpar.append(s.charAt(curri));
curri++;
}
int i = Integer.parseInt(numpar.toString());
if (curri >= s.length() - 1) {
arr.add(i);
return;
}
if ('*' == s.charAt(curri)) {
while (curri < s.length() && '*' == s.charAt(curri)) {
numpar = new StringBuilder();
curri++;
while ( curri < s.length() && (!regres.contains(s.charAt(curri))
|| ('-' == s.charAt(curri) && numpar.length() == 0))) {
numpar.append(s.charAt(curri));
curri++;
}
i = i * Integer.parseInt(numpar.toString());
}
if (curri >= s.length() - 1) {
arr.add(i);
return;
}
if ('+' == s.charAt(curri)) {
arr.add(i);
arr.add('+');
compute(s, ++curri, arr);
} else {
arr.add(i);
arr.add('-');
compute(s, ++curri, arr);
}
} else {
if ('+' == s.charAt(curri)) {
arr.add(i);
arr.add('+');
compute(s, ++curri, arr);
} else {
arr.add(i);
arr.add('-');
compute(s, ++curri, arr);
}
}
}
}