**统计盈利目标区间**
2026 华为OD机试真题 6月3日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
某公司的财务流水系统重构为实时流处理架构。日盈利数据(可正可负)作为消息一条条实时推送。 请设计一个实时监控模块,它接收两个序列:操作指令序列 ops 和对应的参数序列 vals。
- 当 ops[i] == "add" 时:代表接收一条新的日盈利流数据,其值为 vals[i]。
- 当 ops[i] == "query" 时:代表发起一次实时查询,目标值为 vals[i](即 target)。要求立刻返回:以当前最新到达的这笔流水为区间右端点,且区间总和恰好等于 target 的连续区间个数。
2026 华为OD机试真题 6月3日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
输入描述
ops:字符串数组,表示操作指令序列。
vals:整型数组,表示与 ops 一一对应的参数序列。对于 add 指令,代表盈利值;对于 query 指令,代表目标值 target。
输出描述
返回一个整型数组,按照 query 指令出现的顺序,依次保存每次查询的结果,如果没有 query ,返回空数组,如果 query 没有符合条件的区间,返回 0
约束条件
-
ops 中仅包含" add "和" query ", ops.length<=105
-
−104<=values[i]<=104当操作作为add$
-
−109<=values[i]<=109 当操作作为 query
-
用例的输入都是合法的
示例1
输入
add,add,query,add,query
1,2,3,3,6
输出
[1,1]
说明
- add 1:流为 [1]
- add 2:流为 [1,2]
- query 3:最新数据是 2。以 2 结尾且和为 3 的区间只有 [1,2],返回 1。
- add 3:流为 [1,2,3]
- query 6:最新数据是 3。以 3 结尾且和为 6 的区间只有 [1,2,3],返回 1。
示例2
输入
add,add,add,query,add,add,query
1,-1,0,0,1,-1,0
输出
[2,3]
说明
- 前三次 add 后,流为 [1,−1,0]。
- 第一个 query 0:以最新元素 0 结尾,和为 0 的区间有 [0] 和 [1,−1,0],返回 2 。
- 后两次 add 后,流为 [1,−1,0,1,−1]。
- 第二个 query 0:以最新元素 −1 结尾,和为 0 的区间有 [1,−1]、[0,1,−1]、[1,−1,0,1,−1],返回 3。
解题思路
本题本质上是在一个动态增长的数组中,查询“以最后一个元素结尾、且区间和为目标值”的连续区间数量。
- 前缀和:设
current_prefix_sum为截止到当前所有add数据的累计和。 - 哈希表计数:维护一个哈希表
prefix_sum_count,键是某个历史前缀和值,值是该前缀和出现的次数。 - 关键转换:当我们想找区间和为
target的区间时,若当前前缀和为S,则需要找到一个左端点前一位的前缀和S - target。 - 算法流程:
add val:先将当前current_prefix_sum记录到prefix_sum_count中(因为它是新区间左端点的前一位),然后更新current_prefix_sum += val。query target:直接查询prefix_sum_count[S - target]的值即可。
复杂度分析
- 时间复杂度:每次操作(add 或 query)都是 O(1) 的哈希表操作,整体为 O(N),其中 N 为 ops 数组长度。
- 空间复杂度:最坏情况下需要存储 N 个不同的前缀和值,为
版权声明:
作者:魔改工程师
链接:https://www.sylblog.xin/archives/487
文章版权归作者所有,未经允许请勿转载。
THE END