数组元素聚合:实现累加结果不超过指定值的技术问题
问题描述
现有数组示例:var myArray = new[] { 1, 2, 3, 1, 3, 1, 3, 1, 2, 1, 2, 7};
需求:生成新列表,按顺序累加数组元素,若当前累加值加上下一个元素超过6,则将当前累加值存入新列表,从下一个元素重新开始累加。
预期结果:6, 5, 6, 3, 7
当前尝试的代码存在最后一个元素被遗漏的问题,寻求最优实现方案。附上尝试的代码:
int[] DoAggregate(int[] array) { var prev = 0; bool first = true; var sum = 0; List<int> result = new(); foreach (var item in array) { if (first) { first = false; } else { sum = sum + prev; if ((sum + item) > 6) { result.Add(sum); sum = 0; prev = item; continue; } } prev = item; } return result.ToArray(); }
最优实现方案
原代码问题分析
- 循环结束后未处理最后一组累加的元素,导致最后一个元素或最后一组值被遗漏
- 用
first标记和prev变量的逻辑过于冗余,容易出现边界错误
优化后的代码
int[] DoAggregate(int[] array) { // 处理空数组的边界情况 if (array == null || array.Length == 0) return Array.Empty<int>(); List<int> result = new(); int currentSum = array[0]; for (int i = 1; i < array.Length; i++) { int nextItem = array[i]; // 检查当前累加值加下一个元素是否超过6 if (currentSum + nextItem > 6) { result.Add(currentSum); currentSum = nextItem; } else { currentSum += nextItem; } } // 必须添加最后一组的累加值,这是原代码遗漏的关键步骤 result.Add(currentSum); return result.ToArray(); }
代码逻辑说明
- 先做空数组校验,避免索引越界异常
- 初始化
currentSum为数组第一个元素,从第二个元素开始遍历 - 遍历过程中,每次判断当前累加值与下一个元素的和是否超过6:
- 超过则将当前累加值存入结果,重置
currentSum为下一个元素 - 未超过则直接累加
- 超过则将当前累加值存入结果,重置
- 循环结束后,将最后一组的累加值加入结果,确保所有元素都被处理
调用该方法传入示例数组,返回结果为[6, 5, 6, 3, 7],完全符合预期。
内容的提问来源于stack exchange,提问作者Isaac Ikusika
相关产品推荐
相关产品推荐

