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

Java递归拆分整数数组校验平均值相等的代码异常排查

错误原因排查

  • 基准条件分支缺失打印逻辑
    你代码中的打印语句仅在for循环全部遍历完成后才会执行,当触发b.size() == 1的负向基准条件时,会直接return false,不会走到打印逻辑,所以所有触发该基准条件的递归路径都不会输出你预期的a数组内容。
  • 递归状态未正确维护
    你在for循环中直接修改了当前方法栈的a和b数组(执行a.add(b.remove(i))),传递给下层递归后没有回退当前层的数组状态,导致下一轮循环的初始状态错误,大量递归路径被遗漏没有执行,程序提前终止。
  • 浮点相等判断存在精度隐患
    用double除法结果直接判断相等,可能因为浮点数精度丢失出现误判,建议改用整数交叉相乘的方式校验平均值相等:aSum * b.size() == bSum * a.size()。

修复后参考代码

public boolean canSplitArraySameAverage(ArrayList<Integer> a, ArrayList<Integer> b) {
    long aSum = 0, bSum = 0;
    for (int it : a) {
        aSum += it;
    }
    for (int it : b) {
        bSum += it;
    }

    // 改用整数交叉相乘避免浮点误差
    if (!a.isEmpty() && !b.isEmpty() && (aSum * b.size() == bSum * a.size())) {
        return true;
    }

    if (b.size() == 1) {
        // 基准条件处添加打印
        System.out.println("Return :" + a);
        return false;
    }

    for (int i = 0; i < b.size(); i++) { 
        // 不修改当前层的a、b,直接构造新数组传递给下层递归,避免状态混乱
        ArrayList<Integer> newA = new ArrayList<>(a);
        newA.add(b.get(i));
        ArrayList<Integer> newB = new ArrayList<>(b);
        newB.remove(i);

        if (canSplitArraySameAverage(newA, newB)) {
            return true;
        }
    }

    // 非基准条件的负向返回可按需保留打印
    // System.out.println("Return :" + a);  
    return false;
}

内容的提问来源于stack exchange,提问作者codingcredo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 05:54:02