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

动态追加元素的数组连续三元素求和代码故障排查

问题:动态追加元素时判断连续三数之和的代码故障排查

我需要实现动态向数组追加元素时,判断是否存在连续三个元素之和等于传入参数值的功能。已编写如下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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:45:38