You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
((2
3)-(45)) = -14
((2
(3-4))5) = -10
(2
((3-4)5)) = -10
(((2
3)-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:35:09