按总数值拆分数组为子块:子块总数值不超过4
数组按总和拆分的实现方案
这个需求其实很常见,核心就是动态累加分组——遍历数组时时刻跟踪当前子块的总和,一旦加上下一个元素就超4,就立刻把当前子块“收尾”,开始新的子块。我给你写个完整的JavaScript实现,完全匹配你要的效果:
实现思路
- 准备三个核心变量:
chunks存最终的子块数组,currentChunk存当前正在构建的子块,currentSum跟踪当前子块的总和(比每次计算数组总和效率高) - 遍历原数组的每个元素:
- 先预判:如果当前子块总和加上当前元素会超过4,就把当前子块放进结果数组,然后用当前元素初始化新的子块
- 如果没超过,就把当前元素加入当前子块,同步更新总和
- 遍历结束后,别忘了把最后一个没来得及加入的子块也放进结果数组(循环里只有“超了才放”,最后一个子块不会触发这个条件)
代码示例
const arr = [1, 2, 4, 1, 1, 4, 2, 2, 1, 4]; const chunks = []; let currentChunk = []; let currentSum = 0; for (const num of arr) { if (currentSum + num > 4) { chunks.push(currentChunk); currentChunk = [num]; currentSum = num; } else { currentChunk.push(num); currentSum += num; } } // 处理最后一个未收尾的子块 chunks.push(currentChunk); console.log(chunks); // 输出结果:[[1,2,1],[4],[1,2,1],[4],[2],[4]]
关键细节说明
- 效率优化:用
currentSum跟踪总和,避免每次调用currentChunk.reduce()计算总和,尤其是数组很大的时候,性能提升明显 - 边界处理:像单个元素4这种刚好等于4的情况,会自动作为单独子块;如果数组里有多个小数值(比如1),会尽可能打包到一个子块里,直到加下一个就超4为止
- 元素合法性:假设原数组里的所有元素都≤4(题目示例也是如此),如果有大于4的元素,需要额外处理(比如抛出错误,因为不符合“每个子块总和不超过4”的要求)
内容的提问来源于stack exchange,提问作者Puzzles
相关产品推荐
相关产品推荐

