1. Job Roadmap
  2. Home
  3. Problem Set
  4. codenotelist
  5. Forum
  6. course
  7. Shore Share Sessions
  8. Record
  1. Login
  2. Sign Up
  3. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文
    ZhContent TextSol AI分析

解题思路

本题要求计算一次写入数据包之后新的 write_indexwrite\_indexwrite_index。

需要注意三点:

  1. 实际写入起点不是原始 write_indexwrite\_indexwrite_index,而是从 write_indexwrite\_indexwrite_index 开始向后找到的第一个满足对齐要求的位置。
  2. 如果对齐后的位置等于或超过 capacitycapacitycapacity,说明本次写入起点需要回绕到 000。
  3. 判断空间是否足够时,不能只看数据包长度,还要把为了对齐而跳过的空间也算入本次消耗。

P14189.循环内存存取计算(100分)

    1000ms Tried: 130 Accepted: 18 Difficulty: 4 所属公司 : 华为od
    算法与标签>模拟

题目内容

1、当前有一段循环使用的内存来存放多个数据包,这块内存有两个索引:

  • read_indexread\_indexread_index:读索引,指向当前已存储的数据包的起始位置,读取数据后,read_indexread\_indexread_index 会跳转到下一个存放数据的起点。
  • write_indexwrite\_indexwrite_index:写索引,指向当前可写入新数据包的起始位置,写入数据后,write_indexwrite\_indexwrite_index 会跳转到下一个待写入数据包的起点。

2、整个循环内存对数据存放的起始地址有严格的对齐要求,通常字节对齐的值为 222 的整数倍,例如 2、4、8、162、4、8、162、4、8、16 等。

  • 整个循环内存的长度本身满足对齐要求是字节对齐值的整数倍。
  • 每个数据包存放的起始位置,必须是字节对齐的整数倍。
  • 存放数据以后,计算新的 write_indexwrite\_indexwrite_index 也必须满足字节对齐要求。

3、循环内存是环形的,如果存入新的数据时超出了缓冲区末尾,剩余部分将从索引000开始继续存储。

现在给定以下输入:

  • capacitycapacitycapacity:内存的空间大小(capacitycapacitycapacity 的长度是字节对齐值的整数倍)
  • alignalignalign:字节对齐的值(alignalignalign 的值是 2n2^n2n)
  • read_indexread\_indexread_index:当前读索引的值
  • write_indexwrite\_indexwrite_index:当前写索引的值(如果输入的 write_index=read_indexwrite\_index=read\_indexwrite_index=read_index,代表当前缓冲区没有任何内容,容量是满的)
  • pkt_sizepkt\_sizepkt_size:写入的数据包的长度

请计算把数据包写入环形缓冲区后,write_indexwrite\_indexwrite_index 的位置。如果在写入新的数据时,环形缓冲区放不下,则返回 −1-1−1。

样例1

输入

100,4,0,1,10

输出

14

说明

capacity=100capacity=100capacity=100,align=4align=4align=4,read_index=0read\_index=0read_index=0,write_index=1write\_index=1write_index=1,pkt_size=10pkt\_size=10pkt_size=10。write_index=1write\_index=1write_index=1 不对齐,下一个对齐点是 444,从位置 444 存入 101010 字节, write_indexwrite\_indexwrite_index 到达位置 141414(141414 不对齐,再下一次会从位置 161616 开始存入)。

样例2

输入

100,1,20,10,15

输出

-1

说明

capacity=100capacity=100capacity=100,align=1align=1align=1,read_index=20read\_index=20read_index=20,write_index=10write\_index=10write_index=10,pkt_size=15pkt\_size=15pkt_size=15。起始位置 101010 存入 151515 字节,到达 252525。但 252525 越过了 read_index=20read\_index=20read_index=20,返回 −1-1−1。

样例3

输入

1024,16,512,1020,100

输出

100

说明

capacity=1024capacity=1024capacity=1024,align=16align=16align=16,read_index=512read\_index=512read_index=512,write_index=1020write\_index=1020write_index=1020,pkt_size=100pkt\_size=100pkt_size=100。 write_index=1020write\_index=1020write_index=1020 尝试对齐到 161616,下一个点是 102410241024。因为 1024>=capacity1024 >= capacity1024>=capacity,起始位置回绕到 000。从 000 存入 100100100 字节,write_indexwrite\_indexwrite_index 到达位置 100100100。

登录后即可使用 AI 分析。

模式
倒计时时长
:

最长 10 小时 59 分;应用后按此时长重新开始。

提示:点击提交记录在左侧题面区域查看详情
题库
AI分析设置
留空使用官方API Key,每天有次数限制(自定义API Key仅限会员和管理员使用,不限次数)
会员和管理员可切换模型;切到 Kimi/智谱/通义/豆包时需填写对应供应商 API Key
升级会员,可将运行与提交冷却时间缩短至 1 秒起

Status

  • Judging Queue
  • Service Status

Development

  • Open Source

Support

  • Help
  • Contact Us

About

  • About
  • Privacy
  • Terms of Service
  • Copyright Complaint
  1. Language
    1. English
    2. 한국어
    3. 简体中文
    4. 正體中文
  2. Legacy mode
  3. Theme
    1. Light
    2. Dark
  1. 京ICP备2025123107号-1
  2. Worker 0, 65ms
  3. Powered by Hydro v5.0.0-beta.18 Community
CLOSE


ScanQRCodePrompt

请使用微信扫描下方二维码完成注册

Forgot password or username?