Java判断数组能否拆分为单元素等于其余元素乘积的bug求助
问题出现原因
- 核心逻辑错误:现有代码默认符合条件的元素一定是数组升序排序后的最大值(最后一位),仅验证了「最大值是否等于剩余元素乘积」这一种场景。但存在负数的场景下,符合条件的元素可能是负数(比如给出的第三个测试用例中符合要求的元素是-20,是数组最小值),根本不会被匹配到,因此返回错误结果。
- 逻辑覆盖不全:没有遍历检查数组中的每一个元素是否满足「等于其余所有元素乘积」的要求,仅验证了最大值这一个元素,自然无法覆盖负数、零等特殊场景。
修复方案
修复思路
遍历数组中的每一个元素,针对当前元素计算其余所有元素的乘积,只要存在任意一个元素满足「元素值等于其余元素乘积」的条件,直接返回true;所有元素都不满足则返回false,同时补充数组长度的边界判断。
修复后代码
public boolean canPartition(int[] data) { // 边界判断:数组长度小于2无法拆分 if (data == null || data.length < 2) { return false; } // 遍历每一个元素作为待校验的目标元素 for (int i = 0; i < data.length; i++) { int product = 1; // 计算除当前元素外的所有元素乘积 for (int j = 0; j < data.length; j++) { if (i != j) { product *= data[j]; } } // 只要有一个元素满足条件直接返回true if (product == data[i]) { return true; } } return false; }
验证结果
用给出的测试用例验证:
canPartition([2, 8, 4, 1])→ 8等于241,返回true,符合预期canPartition([-1, -10, 1, -2, 20])→ 无元素满足要求,返回false,符合预期canPartition([-1, -20, 5, -1, -2, 2])→ -20等于(-1)5(-1)*(-2)*2,返回true,符合预期
内容的提问来源于stack exchange,提问作者Maninder
相关产品推荐
相关产品推荐

