**设计能量管理系统**
2026 华为OD机试真题 6月24日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
设计一个能量管理系统,用于管理多种能源的生产、消耗。系统支持以下功能:
支持添加能源生产与消耗记录;
每条记录对应一个版本号(第 1 条为版本 1,依次递增);
查询指定版本号之前,指定时间段的净能量;
时间重叠按时间交集长度 / 时段总时长进行比例加权。
2026 华为OD机试真题 6月24日华为OD上机新系统考试真题 100 分题型
输入描述
函数输入为字符串数组(长度不超过 1000),字符串组会以一条查询命令结尾,函数返回净能量结果。
输入均为合法数据,能量类型字段不做校验,生产量、消耗量均为 32 位整型数据。 全量查询 版本号输入 A。
所有时间戳以秒为单位,为 Unix 时间戳。
版本号从 1 开始递增。
-
生产记录(可以有多条):字符串以AddProductionRecord 开头 表示生产记录,共计 4 个参数,每个参数通过 , 分隔,参数 1 表示能量类型 (wind,solar,grid) ,参数 2 表示生产量,参数 3 表示生产起始时间,参数 4 表示生产终止时间。
-
消耗记录(可以有多条):字符串以 AddConsumptionRecord 开头 表示消耗记录,共计 3 个参数,每个参数通过 , 分隔,参数 1 表示消耗量,参数 2 表示消耗起始时间,参数 3 表示消耗终止时间。
-
查询命令(只有一条,且为最后一条):字符串以 QueryNetEnergy 表示查询净能量,共 3 个参数,3 个参数间通过 , 分隔,参数 1 表示查询某个版本内的消耗记录(32 位整型数据,如查询全量版本,则该字段为字符 A),参数 2 表示查询起始时间,参数 3 表示查询终止时间(查询时间段为闭区间,即包含起始和终止时间点)
输出描述
净能量,32 位整型数据(四舍五入),取值范围:−2,147,483,648∼2,147,483,647。
示例1
输入
AddProductionRecord,wind,500,1640000000,1640001000
AddConsumptionRecord,100,1640000000,1640000600
AddConsumptionRecord,200,1640000251,1640001251
QueryNetEnergy,3,1640000000,1640001000
输出
250
说明
版本 1: AddProductionRecord,wind,500,1640000000,1640001000
版本 2: AddConsumptionRecord,100,1640000000,1640000600
版本 3: AddConsumptionRecord,200,1640000251,1640001251
QueryNetEnergy,3,1640000000,1640001000
只取前 3 条记录,时间在 1640000000\~1640001000 区间内的
版本 1 完全在查询时间内,生产量 500
版本 2 完全在查询时间内,消耗量 100
版本 3 时间部分重叠,消耗量为 200∗(1640001000−1640000251)/(1640001251−1640000251)=149.8
净能量为 500−100−149.8=250.2,四舍五入为 250
示例2
输入
AddProductionRecord,wind,1000,1640000000,1640000500
QueryNetEnergy,1,1640001000,1640002000
输出
说明
版本 1: AddProductionRecord,wind,1000,1640000000,1640000500
QueryNetEnergy,1,1640001000,1640002000
只取前 1 条记录,时间在 1640001000\~1640002000 区间内的
版本 1 不在查询时间内,查询版本 1 净能量为 0
解题思路
核心思想
能量管理系统的净能量计算,核心思想:
- 版本控制:每条命令对应一个版本号,查询时只考虑指定版本范围内的记录
- 加权计算:时间重叠时,按交集占比折算有效量
- 交集长度 / 总时长 = 加权比例
- 四舍五入:最终结果四舍五入到32位整数
算法步骤
- 解析查询命令,获取版本号范围和查询时间段
- 遍历命令列表,遇到查询命令停止
- 对每个生产/消耗记录:
- 计算时间交集
- 按交集占比加权计算贡献
- 累加到总能量(生产为正,消耗为负)
- 四舍五入并返回结果
复杂度分析
- 时间复杂度:O(n),n为命令数量
- 空间复杂度:O(1),只使用常