环内存存取计算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 的值是 2nread_index当前读索引的值write_index当前写索引的值如果输入的 write_indexread_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说明capacity100,align4,read_index0,write_index1,pkt_size10。write_index1 不对齐下一个对齐点是 4从位置 4 存入 10 字节 write_index 到达位置 14。示例2输入100,1,20,10,15输出-1说明capacity100,align1,read_index20,write_index10,pkt_size15。起始位置 10 存入 15 字节到达 25。但 25 越过了 read_index20返回 -1。示例3输入1024,16,512,1020,100输出100说明capacity1024,align16,read_index512,write_index1020,pkt_size100。 write_index1020 尝试对齐到 16下一个点是 1024。因为 1024capacity起始位置回绕到 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_index2. 对齐调整aligned_start- 将write_index向上取整到align的整数倍aligned write_index (align - write_index % align) % align- 若对齐后超出capacity则起始位置回绕到0跳过的字节作为填充padding3. 可行性判断与结果计算- 实际所需空间 填充字节padding 数据包大小pkt_size - 若所需空间 可用空间说明会覆盖未读数据返回 -1 - 否则新写索引 (aligned_start pkt_size) % capacity复杂度分析时间复杂度: O(1)仅进行若干算术运算和取模操作空间复杂度: O(1)使用常数