流式累计求和
Running Cumulative Sum over a Stream
开始编码你正在处理一段整数事件流,每个值按时间顺序到来。每当一个新事件到达时,你必须立即输出截至本笔(含)为止的累计和——也就是当前已观测到的所有值之和。请实现 solution(values: list[int]) -> list[int]:传入完整序列,返回一个等长列表,第 i 项等于 values[0] + values[1] + ... + values[i]。
这是最经典的单标量累加器模式:维护一个 running total,每个事件来了就更新它、输出它。一次扫描,O(N) 时间,输出列表之外只用 O(1) 辅助状态。操作顺序必须是 total += v 然后才追加到输出——先输出再更新会差一位(第一项会被错写成 0 而不是 values[0])。
示例
solution([1, 2, 3, 4]) 返回 [1, 3, 6, 10]。事件 0 到达后总和为 1;事件 1 到达后为 1 + 2 = 3;事件 2 后 3 + 3 = 6;事件 3 后 6 + 4 = 10。每一项都是「包括刚到达的这一笔」的累计和。
solution([0, 0, 0, 0]) 返回 [0, 0, 0, 0]。零值事件不会推动累加器,但仍然会产生输出项——输出长度必须等于输入长度、一笔一项,与值是否对累加有贡献无关。
solution([5, -5, 5, -5, 5]) 返回 [5, 0, 5, 0, 5]。正负相抵在累加器里直接发生;累计和可能多次回到同一个值,这是允许的——输出并不要求单调。
代码骨架见 stubs/stub.py。
实战背景
流式累计求和是事件流上的最简 fold——而 fold 是流处理的基石。实时交易系统里,策略接收一串逐笔 P&L 增量,每个事件后都要立刻知道截至当前的累计 P&L:这正是上述循环。同样的模式驱动了 cumulative volume(每笔成交手数累加,VWAP 分母里的 V)、cumulative notional(成交金额 = 价 × 量,VWAP 分子)、做市商库存追踪(带符号成交累加为净持仓)、以及盘中的各类风险归因累计量。生产系统在两个方向上推广这一模式:(1) 窗口化 fold——把无界总和换成「剔除 T 秒以前事件」,需要用 deque 保留历史,O(1) 辅助状态升级为 O(window);(2) 增量统计——方差、指数加权均值(EWMA)、在线分位数——保留状态多于一个 sum,但每事件仍是 O(1) 更新。无界累计求和是这条路径的入口:把 index 对齐做对(第 i 项含事件 i)、把更新-输出顺序做对,你就内化了所有单遍流式聚合共享的节奏。
约束条件
- 0 ≤ N = len(values) ≤ 10⁵
- 对每个 i 满足 -10⁹ ≤ values[i] ≤ 10⁹
- 输出长度等于 N;第 i 项是 `values[0..i]`(含本笔)的求和
- 输出元素为 Python `int`(任意精度,不必担心溢出)
- 空输入直接返回空列表 `[]`
样例
Case 1 · typical: small mixed positives
输入: [[1,2,3,4]]
期望: [1,3,6,10]
依次累加:1 → 1+2=3 → 3+3=6 → 6+4=10。每一项就是「截至该位置(含)」的累计求和。
Case 2 · edge: empty input
输入: [[]]
期望: []
输入为空流,没有任何事件,累加器始终为 0,返回空列表 `[]`,长度严格等于输入长度 0。
Case 3 · edge: all zeros
输入: [[0,0,0,0,0]]
期望: [0,0,0,0,0]
全 0 输入下累加器一直为 0,输出每一项都是 0。验证零输入不会被错误地跳过或过滤。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · typical: small mixed positives
输入: [[1,2,3,4]]
期望: [1,3,6,10]
依次累加:1 → 1+2=3 → 3+3=6 → 6+4=10。每一项就是「截至该位置(含)」的累计求和。
Case 2 · edge: empty input
输入: [[]]
期望: []
输入为空流,没有任何事件,累加器始终为 0,返回空列表 `[]`,长度严格等于输入长度 0。
Case 3 · edge: all zeros
输入: [[0,0,0,0,0]]
期望: [0,0,0,0,0]
全 0 输入下累加器一直为 0,输出每一项都是 0。验证零输入不会被错误地跳过或过滤。