**统计盈利目标区间**

2026 华为OD机试真题 6月3日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

某公司的财务流水系统重构为实时流处理架构。日盈利数据(可正可负)作为消息一条条实时推送。 请设计一个实时监控模块,它接收两个序列:操作指令序列 ops 和对应的参数序列 vals。

  1. 当 ops[i] == "add" 时:代表接收一条新的日盈利流数据,其值为 vals[i]。
  2. 当 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

约束条件

  1. ops 中仅包含" add "和" query ", ops.length<=105

  2. −104<=values[i]<=104当操作作为add$

  3. −109<=values[i]<=109 当操作作为 query

  4. 用例的输入都是合法的

示例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 个不同的前缀和值,为
THE END