如何在有序无重复ArrayList中找到末尾数最大的连续5个整数
问题分析与代码修正
原代码的核心问题
- 连续序列追踪逻辑错误:原代码仅在遇到相邻连续元素时,将前一个元素加入结果,导致收集的是多个不连贯片段的元素(比如
15来自15-14片段,12来自12-11片段),而非同一个连续5个元素的完整序列。 - 不必要的副作用:
Collections.reverse(al)会原地修改传入的列表,破坏原数据结构。
修正后的代码
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; public class Game { public static void test2(ArrayList<Integer> al) { ArrayList<Integer> result = new ArrayList<>(); int currentSeqLength = 1; // 初始化,加入最后一个元素作为序列起点 result.add(al.get(al.size() - 1)); // 从倒数第二个元素开始向前遍历 for (int i = al.size() - 2; i >= 0; i--) { // 检查当前元素与后一个元素是否连续(原列表是递增有序) if (al.get(i) == al.get(i + 1) - 1) { result.add(al.get(i)); currentSeqLength++; // 找到连续5个元素就停止遍历 if (currentSeqLength == 5) { break; } } else { // 不连续则重置当前序列 result.clear(); result.add(al.get(i)); currentSeqLength = 1; } } // 若需要正序结果(题目说明顺序无关,此步可选) Collections.reverse(result); System.out.println("new list: " + result); } public static void main(String[] args) { ArrayList<Integer> al = new ArrayList<>(Arrays.asList(3, 5, 7, 8, 9, 10, 11, 12, 14, 15)); test2(al); } }
修正逻辑说明
- 从后往前遍历:优先查找末尾数更大的连续序列,一旦找到长度为5的序列就停止,符合需求中“末尾数最大”的要求。
- 完整追踪连续序列:维护当前连续序列的长度,遇到不连续元素时重置序列,确保收集的是同一个连续片段的元素。
- 无副作用:不会修改传入的原列表,避免影响其他逻辑。
运行后输出为[8, 9, 10, 11, 12],完全符合预期。
内容的提问来源于stack exchange,提问作者Nate650
相关产品推荐
相关产品推荐

