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
相关产品推荐
相关产品推荐

