题解:限长传送带¶
出题人解法:预留一格的循环队列。Codex(GPT-6)整理实现,补齐零容量、零元素及有符号边界的说明,使用可移植的缓冲读取。
循环队列与不变量¶
申请 \(n+1\) 个整数位置,用 \(Head,Tail\) 表示队首和下一个待写位置。下标到达 \(n+1\) 时绕回零。队列中的有效元素按循环顺序组成半开区间 \([Head,Tail)\) ,最多使用 \(n\) 格,留一格区分空与满。
- \(Head=Tail\) 表示空。
- \(Next(Tail)=Head\) 表示满。
- 插入成功时写入 \(Tail\) ,再前移 \(Tail\) .
- 删除成功时输出 \(Head\) 处的值,再前移 \(Head\) .
初始两下标都为零,不变量成立。插入在有效区间末尾增加一项,删除只移除首项;判满和判空阻止越过容量边界,故始终正确模拟先进先出队列。忽略操作不会改变状态。
当 \(n=0\) 时,数组长度为一,空与满同时成立,两种操作均被忽略。不能用元素值零判断空位,因为零是合法数据。
实现与复杂度¶
每次操作耗时 \(O(1)\) ,总时间 \(O(m)\) ,空间 \(O(n)\) .输入使用小型缓冲区,不存储全部操作。先在 64 位整数中读取绝对值和处理符号,再转换为 32 位整数,因此最小值 \(-2^{31}\) 不会在取负时溢出。
标准程序把队列封装为结构体。用计数器区分满与空也成立,但与循环队列属于同一实现思路;链式节点会增加存储开销,无需作为独立解法。