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

数组元素聚合:实现累加结果不超过指定值的技术问题

问题描述

现有数组示例: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();
}
最优实现方案

原代码问题分析

  1. 循环结束后未处理最后一组累加的元素,导致最后一个元素或最后一组值被遗漏
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:10:25