题干:
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。
示例:
输入:"2-1-1"
输出:[0, 2]
解释: ((2-1)-1) = 0 (2-(1-1)) = 2
public class 为运算表达式设计优先级 {
public static void main(String[] args) {
String expression = "2-1-1";
List<Integer> ans = diffWaysToCompute(expression);
for (Integer integer : ans) {
System.out.println(integer);
}
}
public static List<Integer> diffWaysToCompute(String input) {
List<Integer> ans = new ArrayList<>();
if(input.length()==0||input==null) return new ArrayList<>();
for(int i=0;i<input.length();i++){
char achar = input.charAt(i);
if(achar=='+'||achar=='-'||achar=='*')
{
List<Integer> left = diffWaysToCompute(input.substring(0,i));
List<Integer> right = diffWaysToCompute(input.substring(i+1));
for (Integer l : left) {
for (Integer r : right) {
switch (achar){
case '+': ans.add(l+r);break;
case '-': ans.add(l-r);break;
case '*': ans.add(l*r);break;
}
}
}
}
}
if (ans.size() == 0) {
ans.add(Integer.valueOf(input));
}
return ans;
}
}
该题是要把字符串中的表达式按不同的优先级结合后,统计运算结果。
思路是遍历字符串,当遇到加、减、乘的符号时,以此符号位置作为分界点,让左右两边的子串递归计算各自的运算结果集,再通过一个双层循环让左右子串的运算结果集相互组合,得到最终的整个表达式的运算结果集。
注意最后的if,这个if是当左右子串中只有一个数字时(此时该子串的运算结果集为空),把这个数字转换成Integer对象(其值就是数字的值),作为该子串的运算结果集。