**环内存存取计算**

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),使用常数
THE END