感觉再题目中真的算是难的了:我的解决思路就是:
1、先递归分割出由()包裹的子字符串,对子字符串同样的处理方式,直至消除()
2、没有()后,先进行计算所有累计 *
3、最后按顺序 + -即可,我只是完成了,还可以优化,懒得搞了。。
代码如下:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
return computeValue(s);
}
public int computeValue(String s){
char[] chars = s.toCharArray();
ArrayList<String> list = new ArrayList<>();
int i = 0;
while (i < chars.length){
switch(chars[i]){
case '(':
Stack<Character> brackets = new Stack<>();
brackets.push(chars[i]);
int begin = i;
while (!brackets.isEmpty()){
i++;
switch(chars[i]){
case '(':
brackets.push(chars[i]);
break;
case ')':
brackets.pop();
break;
}
}
list.add(String.valueOf(computeValue(s.substring(begin+1,i))));
break;
case '+':
list.add("+");
break;
case '-':
list.add("-");
break;
case '*':
list.add("*");
break;
default:
String num ="";
while ( i < chars.length && isNumber(chars[i])){
num+=chars[i];
i++;
}
list.add(num);
continue;
}
i++;
}
ArrayList<String> objects = new ArrayList<>();
for(int j = 0; j < list.size();j++){
int result = 0;
if(j < list.size()-1 && list.get(j+1).equals("*")){
result=Integer.parseInt(list.get(j));
while (j < list.size()-1 && list.get(j+1).equals("*")){
j++;
result*=Integer.parseInt(list.get(++j));
}
objects.add(String.valueOf(result));
}else {
objects.add(list.get(j));
}
}
int result = Integer.parseInt(objects.get(0));
for(int j = 1;j < objects.size();j++){
String s1 = objects.get(j);
switch(s1){
case "+":
result+=Integer.parseInt(objects.get(j+1));
break;
case "-":
result-=Integer.parseInt(objects.get(j+1));
break;
}
}
return result;
}
public boolean isNumber(char i){
switch(i){
case '+':
case '-':
case '*':
case '(':
case ')':
return false;
}
return true;
}}



京公网安备 11010502036488号