题解 | #表达式求值#
表达式求值
http://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
感觉再题目中真的算是难的了:我的解决思路就是:
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; }
}