动态追加元素的数组连续三元素求和代码故障排查
问题:动态追加元素时判断连续三数之和的代码故障排查
我需要实现动态向数组追加元素时,判断是否存在连续三个元素之和等于传入参数值的功能。已编写如下Java代码,部分测试用例能得到预期输出,但仍有未知测试用例失败,请求帮忙排查可能的故障场景。
import java.util.LinkedList; import java.util.List; public class Test { List<Integer> mergeList = new LinkedList<Integer>(); List<List<Integer>> allList = new LinkedList<List<Integer>>(); List<Integer> tail; int from = 0; int to = 0; public void addLast(int[] list) { allList.removeAll(allList); for(int i : list) { mergeList.add(i); } if (mergeList.size() > 0) { int j = 0; while(to < mergeList.size()){ from = j; to = j + 3; tail = mergeList.subList(from, to); j++; allList.add(tail); } } } public boolean containsSum3(int sum) { boolean retVal = false; for (List<Integer> sum3List : allList) { if (sum3List.stream().mapToInt(Integer::intValue).sum() == sum) { retVal = true; } } return retVal; } public static void main(String[] args) { Test s = new Test(); s.addLast(new int[] { 1, 2, 3 }); System.out.println(s.containsSum3(6)); System.out.println(s.containsSum3(9)); s.addLast(new int[] { 4 }); System.out.println(s.containsSum3(9)); s.addLast(new int[] { 5, 2}); System.out.println(s.containsSum3(11)); s.addLast(new int[] { 0, -1 }); System.out.println(s.containsSum3(7)); System.out.println(s.containsSum3(2)); } }
当前输出:
true false true true true false
核心故障点及场景
1. 成员变量复用导致逻辑混乱
to和from是类的成员变量,而非addLast方法的局部变量,多次调用addLast时会保留上一次的数值,直接破坏循环逻辑:
- 故障场景:先调用
addLast(new int[]{1,2})(此时mergeList长度为2,to被赋值为3),再调用addLast(new int[]{3})(mergeList长度变为3)。此时循环条件to < mergeList.size()即3 < 3不成立,循环完全不执行,allList为空,调用containsSum3(6)会错误返回false(正确结果应为true)。
2. 循环终止条件错误,可能引发索引越界
当mergeList长度小于3时,to = j+3会直接大于等于列表长度,调用subList(from, to)会抛出IndexOutOfBoundsException。比如调用addLast(new int[]{1})后,进入循环尝试截取0-3的子列表,直接触发异常。
3. 冗余遍历影响性能
containsSum3方法找到符合条件的子列表后未立即返回,会继续遍历所有子列表,虽然不影响结果,但完全没必要。
4. 低效的集合清空操作
allList.removeAll(allList)的清空效率远低于allList.clear(),属于不必要的性能损耗。
修复后的代码
import java.util.LinkedList; import java.util.List; public class Test { List<Integer> mergeList = new LinkedList<>(); List<List<Integer>> allList = new LinkedList<>(); public void addLast(int[] list) { allList.clear(); // 替换低效的removeAll for(int i : list) { mergeList.add(i); } // 仅当列表长度≥3时才生成连续三元素子列表 if (mergeList.size() >= 3) { // 循环终止条件改为j ≤ mergeList.size()-3,确保能取到完整的三元素子列表 for (int j = 0; j <= mergeList.size() - 3; j++) { List<Integer> subList = mergeList.subList(j, j + 3); allList.add(subList); } } } public boolean containsSum3(int sum) { for (List<Integer> sum3List : allList) { // 直接求和,比stream更高效 int total = sum3List.get(0) + sum3List.get(1) + sum3List.get(2); if (total == sum) { return true; // 找到结果立即返回 } } return false; } public static void main(String[] args) { Test s = new Test(); s.addLast(new int[] { 1, 2, 3 }); System.out.println(s.containsSum3(6)); // true System.out.println(s.containsSum3(9)); // false s.addLast(new int[] { 4 }); System.out.println(s.containsSum3(9)); // true(2+3+4=9) s.addLast(new int[] { 5, 2}); System.out.println(s.containsSum3(11)); // true(4+5+2=11) s.addLast(new int[] { 0, -1 }); System.out.println(s.containsSum3(7)); // true(5+2+0=7) System.out.println(s.containsSum3(2)); // false // 新增故障场景测试 s = new Test(); s.addLast(new int[]{1,2}); s.addLast(new int[]{3}); System.out.println(s.containsSum3(6)); // 现在返回正确的true } }
内容的提问来源于stack exchange,提问作者chk.buddi
相关产品推荐
相关产品推荐

