Java表达式求值中左右循环嵌套顺序的差异疑问
问题背景
我们需要处理由数字与运算符组成的字符串表达式,返回通过不同括号分组计算得到的所有可能结果。示例如下:
示例1
输入:expression = "2-1-1"
输出:[0,2]
解释:
((2-1)-1) = 0
(2-(1-1)) = 2
示例2
输入:expression = "2*3-4*5"
输出:[-34,-14,-10,-10,10]
解释:
(2*(3-(45))) = -34
((23)-(45)) = -14
((2(3-4))5) = -10
(2((3-4)5)) = -10
(((23)-4)*5) = 10
代码片段
class Solution { public List<Integer> diffWaysToCompute(String expression) { ArrayList <Integer> result = new ArrayList<Integer>(); if (!expression.contains("+") && !expression.contains("-") && !expression.contains("*")) { result.add(Integer.parseInt(expression)); } for(int i=0 ; i<expression.length()-1 ; i++){ if(expression.charAt(i) == '+' || expression.charAt(i) == '-' || expression.charAt(i) == '*'){ String leftpart = expression.substring(0,i); String rightpart = expression.substring(i+1); List <Integer> leftresults = diffWaysToCompute(leftpart); List <Integer> rightresults = diffWaysToCompute(rightpart); for (int left : leftresults) { for (int right : rightresults) { if (expression.charAt(i) == '+') { result.add(left + right); } else if (expression.charAt(i) == '-') { result.add(left - right); } else if (expression.charAt(i) == '*') { result.add(left * right); } } } } } return result; } }
疑问与解答
我不理解代码中将右循环嵌套在左循环的设计,若改为将左循环嵌套在右循环中会发生什么?这两种嵌套方式有何差异?
原嵌套方式:
for (int left : leftresults) { for (int right : rightresults) {
修改后的嵌套方式:
for (int right : rightresults) { for (int left : leftresults) {
两种嵌套方式的差异
核心差异仅在于结果列表中元素的顺序,不会影响最终返回的结果集合(元素的种类和数量完全一致)。
具体逻辑对比:
- 原嵌套逻辑:先遍历所有左值,对每个左值遍历所有右值,计算结果后按该顺序加入列表。比如左结果是
[a,b]、右结果是[x,y],生成的顺序是a+x, a+y, b+x, b+y。 - 修改后的嵌套逻辑:先遍历所有右值,对每个右值遍历所有左值,生成的顺序是
a+x, b+x, a+y, b+y。
对于题目要求而言,因为只需要返回所有可能的计算结果,不限制结果的输出顺序,所以两种写法的功能完全等价。只有当题目明确要求结果的顺序时,两种写法才会产生符合不同要求的输出序列。
以示例1的"2-1-1"为例:
分割点在第一个-时,左结果是[2]、右结果是[0],生成2-0=2;
分割点在第二个-时,左结果是[1]、右结果是[1],生成1-1=0;
无论嵌套顺序如何,最终结果要么是[2,0]要么是[0,2],都符合题目输出要求。
内容的提问来源于stack exchange,提问作者aabaf1921
相关产品推荐
相关产品推荐

