循环中如何为列表添加末尾元素?求最长递增子序列遇代码问题
解决最长连续递增序列问题
我明白你现在遇到的困扰啦——你的代码因为循环只到numbers.Count - 1,导致最后一个符合条件的元素永远没法加入序列,而且当前逻辑也没法完整跟踪最长的递增序列(比如处理序列中断、比对多个序列长度这些场景都没覆盖到)。
先拆解下你代码里的几个小问题:
- 循环终止条件
i < numbers.Count - 1确实会遗漏最后一个元素,因为你只在numbers[i] < numbers[i+1]时添加numbers[i],但最后一个元素没有i+1可以比对 - 额外的
numbers[i] > 0限制会过滤掉所有非正数元素,如果你不是特意要排除负数,这个条件可以去掉 - 没有处理序列中断的情况:遇到不递增的元素时,应该重置当前序列,再和已记录的最长序列做长度比对
接下来给你一个完整的解决方案,能处理连续递增的序列,而且会保留最先出现的最长序列:
List<int> numbers = new List<int> { 1, 3, 5, 2, 4, 6, 7, 1 }; // 示例输入 List<int> longestSequence = new List<int>(); List<int> currentSequence = new List<int>(); // 处理空列表的边界情况 if (numbers.Count == 0) { Console.WriteLine("空列表,无序列可输出"); return; } // 先把第一个元素加入当前序列 currentSequence.Add(numbers[0]); for (int i = 1; i < numbers.Count; i++) { // 如果当前元素比前一个大,就加入当前序列 if (numbers[i] > numbers[i - 1]) { currentSequence.Add(numbers[i]); } else { // 序列中断,对比当前序列和最长序列的长度 if (currentSequence.Count > longestSequence.Count) { longestSequence = new List<int>(currentSequence); } // 重置当前序列,从当前元素重新开始 currentSequence.Clear(); currentSequence.Add(numbers[i]); } } // 循环结束后必须再做一次比对:最后一段递增序列还没被检查 if (currentSequence.Count > longestSequence.Count) { longestSequence = new List<int>(currentSequence); } // 输出结果 Console.WriteLine("最长递增序列:"); foreach (int num in longestSequence) { Console.Write(num + " "); }
代码说明:
- 从第二个元素开始遍历,和前一个元素做比较,确保每个元素都能被处理到
- 每次序列中断时,立即比对当前序列与最长序列的长度,更新最长序列
- 循环结束后的最终比对,避免遗漏最后一段可能的最长序列
- 若存在多个长度相同的最长序列,因为我们只在当前序列更长时才更新,所以会自动保留最先出现的那个
测试示例输入{1,3,5,2,4,6,7,1},输出会是2 4 6 7,这是最长的连续递增序列。如果你的需求是非连续的最长递增子序列(比如1,3,5,6,7这种不连续但递增的),可以随时告诉我,我再给你调整代码~
内容的提问来源于stack exchange,提问作者Nevion
相关产品推荐
相关产品推荐

