**环内存存取计算**
2026 华为OD机试真题 5月10日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
1、当前有一段循环使用的内存来存放多个数据包,这块内存有两个索引:
- read_index:读索引,指向当前已存储的数据包的起始位置,读取数据后,read_index 会跳转到下一个存放数据的起点。
- write_index:写索引,指向当前可写入新数据包的起始位置,写入数据后,write_index 会跳转到下一个待写入数据包的起点。
2、整个循环内存对数据存放的起始地址有严格的对齐要求,通常字节对齐的值为 2 的整数倍,例如 2、4、8、16 等。
- 整个循环内存的长度本身满足对齐要求是字节对齐值的整数倍。
- 每个数据包存放的起始位置,必须是字节对齐的整数倍。
- 存放数据以后,计算新的 write_index 也必须满足字节对齐要求。
3、循环内存是环形的,如果存入新的数据时超出了缓冲区末尾,剩余部分将从索引0开始继续存储。
现在给定以下输入:
- capacity:内存的空间大小(capacity 的长度是字节对齐值的整数倍)
- align:字节对齐的值(align 的值是 2n)
- read_index:当前读索引的值
- write_index:当前写索引的值(如果输入的 write_index=read_index,代表当前缓冲区没有任何内容,容量是满的)
- pkt_size:写入的数据包的长度
请计算把数据包写入环形缓冲区后,write_index 的位置。如果在写入新的数据时,环形缓冲区放不下,则返回 -1。
2026 华为OD机试真题 5月10日华为OD上机新系统考试真题 100 分题型
输入描述
- capacity:内存的空间大小
- align:字节对齐的值
- read_index:当前读索引的值
- write_index:当前写索引的值
- pkt_size:写入的数据包的长度
输入格式:capacity,align,read_index,write_index,pkt_size
输出描述
请计算把数据包写入环形缓冲区后,write_index 的位置。如果在写入新的数据时,环形缓冲区放不下,则返回 -1。
示例1
输入
100,4,0,1,10
输出
14
说明
capacity=100,align=4,read_index=0,write_index=1,pkt_size=10。write_index=1 不对齐,下一个对齐点是 4,从位置 4 存入 10 字节, write_index 到达位置 14。
示例2
输入
100,1,20,10,15
输出
-1
说明
capacity=100,align=1,read_index=20,write_index=10,pkt_size=15。起始位置 10 存入 15 字节,到达 25。但 25 越过了 read_index=20,返回 -1。
示例3
输入
1024,16,512,1020,100
输出
100
说明
capacity=1024,align=16,read_index=512,write_index=1020,pkt_size=100。 write_index=1020 尝试对齐到 16,下一个点是 1024。因为 1024>=capacity,起始位置回绕到 0。从 0 存入 100 字节,write_index 到达位置 100。
解题思路
核心思想
本题模拟环形缓冲区的单次写入操作,核心在于三个关键计算:
1. 计算当前可用空间(free_space)
- 当
write_index == read_index时,按题目规定缓冲区为空,可用空间为完整容量 - 当
write_index < read_index时,写指针在读指针前方,可用空间为两者之间的区域[write_index, read_index) - 当
write_index > read_index时,写指针已越过读指针,可用空间跨越缓冲区末尾:capacity - write_index + read_index
2. 对齐调整(aligned_start)
- 将
write_index向上取整到align的整数倍:aligned = write_index + (align - write_index % align) % align - 若对齐后超出
capacity,则起始位置回绕到,跳过的字节作为填充padding
3. 可行性判断与结果计算
- 实际所需空间 = 填充字节(padding)+ 数据包大小(pkt_size)
- 若所需空间 > 可用空间,说明会覆盖未读数据,返回 -1
- 否则,新写索引 =
(aligned_start + pkt_size) % capacity
复杂度分析
- 时间复杂度: O(1),仅进行若干算术运算和取模操作
- 空间复杂度: O(1),使用常数