如何用C#实现已排序整数数组的连续子数组分组(编程挑战)
实现核心逻辑
由于输入本身是已排序的整数数组,无需额外执行排序操作,分组的核心判定规则非常直接:遍历数组元素时,只要当前元素与上一个元素的差值恰好为1,就将其归入当前连续子数组;只要差值不为1,就闭合当前子数组,开启新的连续分组。
实现过程中需要覆盖几类基础边界场景:
- 空数组/Null输入的兼容处理
- 单元素输入的返回逻辑
- 遍历结束后,最后一个未闭合临时分组的落盘处理
具体C#实现代码
public static int[][] SplitSortedArrayIntoConsecutiveGroups(int[] sortedInput) { // 兼容空输入边界 if (sortedInput == null || sortedInput.Length == 0) { return Array.Empty<int[]>(); } var result = new List<int[]>(); // 临时存储当前正在构造的连续分组 var currentGroup = new List<int> { sortedInput[0] }; // 从第二个元素开始遍历全数组 for (int i = 1; i < sortedInput.Length; i++) { int currentValue = sortedInput[i]; // 取当前分组的最后一个元素做连续值判定 int lastValueInGroup = currentGroup[^1]; if (currentValue == lastValueInGroup + 1) { currentGroup.Add(currentValue); } else { // 不连续则将当前分组存入最终结果,重置临时分组 result.Add(currentGroup.ToArray()); currentGroup = new List<int> { currentValue }; } } // 遍历结束后存入最后一个剩余的分组 result.Add(currentGroup.ToArray()); return result.ToArray(); }
注:如果使用低于C# 8.0的版本,需要将代码中取索引的语法
currentGroup[^1]替换为currentGroup[currentGroup.Count - 1]即可正常运行。
效果验证
针对题目给出的测试用例:
- 输入排序数组:
[1, 2, 3, 5, 6, 8, 9, 10] - 调用方法后输出结果:
[[1, 2, 3], [5, 6], [8, 9, 10]],与预期完全匹配。
其他常见场景的返回结果:
- 输入
[1,3,5,7](无相邻连续值):输出[[1], [3], [5], [7]] - 输入
[2,3,4,5,6](全元素连续):输出[[2,3,4,5,6]] - 输入
[10](单元素输入):输出[[10]] - 输入
[1,2,2,3](存在重复元素):严格按照“后值比前值大1才算连续”的规则,输出[[1,2], [2,3]]
内容的提问来源于stack exchange,提问作者mortis
相关产品推荐
相关产品推荐

