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

ArrayList问题优化解法求助:代码陷入死循环无输出

问题修复:列表操作死循环与逻辑错误

需求回顾

给定列表list=[8,4,9,10,34,54,56],需执行以下操作:

  • 找出列表最小值;
  • 移除最小值及其相邻元素(示例中最小值4的左右相邻都存在,故移除[8,4,9]);
  • 将最小值加入sum变量,对剩余元素重复上述步骤;
  • 最终sum应为68(4+10+54),剩余元素为[56]。

原代码问题分析

  1. 死循环原因:循环条件while(l>=1)未处理列表长度为1的情况,此时无对应分支执行元素移除,l值不变,导致无限循环。
  2. 移除逻辑错误:移除元素时未考虑列表索引的动态变化。例如当移除index-1后,原index位置的元素索引已前移,后续remove(index)会误删其他元素,且部分边界场景(如最小值在列表末尾)未覆盖,会导致索引越界。

修复后的代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> ques = new ArrayList<>(Arrays.asList(8, 4, 9, 10, 34, 54, 56));
        int sum = 0;
        while (ques.size() > 0) {
            int min = Collections.min(ques);
            int index = ques.indexOf(min);
            sum += min;

            // 处理列表长度为2的特殊情况:仅移除最小值,保留剩余元素
            if (ques.size() == 2) {
                ques.remove(index);
            } else {
                // 按右→自身→左的顺序移除,避免索引混乱
                if (index < ques.size() - 1) {
                    ques.remove(index + 1);
                }
                ques.remove(index);
                if (index > 0) {
                    ques.remove(index - 1);
                }
            }

            // 剩余元素不足2个时停止循环
            if (ques.size() <= 1) {
                break;
            }
        }
        System.out.println(sum);
        System.out.println("剩余元素:" + ques);
    }
}

修复说明

  • 调整循环逻辑:通过判断剩余元素数量,避免死循环;
  • 优化移除顺序:按右边相邻→最小值→左边相邻的顺序移除元素,避免索引偏移导致的误删;
  • 处理特殊场景:当列表长度为2时,仅移除最小值,确保最终剩余[56],符合需求示例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:39:50