9.6华为OD机试真题 新系统 – 仓储货物有序出库 (JavaPyCC++JsGo)
2026 华为OD机试真题9月6日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
某仓储中心中有一个货物堆放区,货物编号按乱序堆叠存放,只能从顶部取货(后进先出),管理员需要将货物按编号从小到大取出。
仓库设有 1 个临时区,可将主库顶部货物依次转移到临时区,临时区也为堆叠存放(后进先出);主库或临时区顶部货物均可直接出库;其他操作(包括主库→临时区 和 临时区→主库)均为“暂存”操作;请计算至少需要多少次暂存操作,能保证所有货物按编号从小到大依次出库。
补充说明:
- 临时区有且只有一个
- 出库顺序必须是严格升序,每件出库货物的编号必须大于前一件
- 题目保证所有货物编号互不重复(可能为负数,编号数字不保证连续)
- 题目保证总能找到一种合法的操作方案完成有序出库
2026 华为OD机试真题9月6日华为OD上机新系统考试真题 100 分题型
输入描述
参数 1:一个整数 n(1\<n<1000),表示货物的总数量。
参数 2:整数数组 [a1,a2,…,an](−1000\<ai<1000),表示货物的编号,从左到右依次对应货物堆底部到顶部。
输出描述
一个整数,表示最少暂存操作次数。
示例1
输入
3,1,2
输出
1
说明
货物堆初始状态(底部→顶部):[3 号, 1 号, 2 号],顶部货物为 2 号
目标出库顺序:1 号 → 2 号 → 3 号
操作过程:
- 顶部是 2 号,但目标需要 1 号,将 2 号暂存到临时区(暂存次数 = 1)
- 顶部是 1 号,直接出库 → 已出库:[1 号]
- 临时区顶部是 2 号,出库 → 已出库:[1 号, 2 号]
- 货物堆顶部是 3 号,出库 → 已出库:[1 号, 2 号, 3 号]
最少暂存次数:1
示例2
输入
1,2,3
输出
2
说明
货物堆初始状态(底部→顶部):[1 号, 2 号, 3 号],顶部货物为 3 号
目标出库顺序:1 号 → 2 号 → 3 号
操作过程:
- 顶部是 3 号,但目标需要 1 号,将 3 号暂存(次数 = 1)
- 顶部是 2 号,但目标需要 1 号,将 2 号暂存(次数 = 2)
- 顶部是 1 号,直接出库
- 临时区顶部是 2 号,出库
- 临时区顶部是 3 号,出库
最少暂存次数:2
示例3
输入
6,5,2,4,3,1
输出
3
说明
货物堆初始状态(底部→顶部):[6,5,2,4,3,1],顶部为 1 号
目标出库顺序:1 → 2 → 3 → 4 → 5 → 6
操作过程:
- 主库顶部 1 号,直接出库 → 主库:[6,5,2,4,3],临时:[]
- 目标 2 号在主库深度 2(上方隔着 3 和 4),将 3、4 暂存到临时区,暂存次数 = 2 → 主库:[6,5],临时:[3,4](顶)
- 主库顶部 2 号,直接出库 → 主库:[6,5]
- 目标 3 号在临时区深度 1(上方隔着 4),将 4 暂存回主库,暂存次数 = 3 → 主库:[6,5,4],临时:[3](顶)
- 临时区顶部 3 号,直接出库
- 主库顶部 4 号,直接出库
- 主库顶部 5 号,直接出库
- 主库顶部 6 号,直接出库
最少暂存次数:3
关键:第 4 步体现了双向暂存的价值 —— 将临时区的 4 移回主库,释放 3 出库。若无双向暂存,此场景无法解决。
解题思路
核心思想
主库和临时区都可以看成栈,栈顶是当前唯一能直接操作的位置。目标出库顺序是所有货物编号从小到大排序后的结果。
对于当前要出库的货物 target:
- 如果它在主库中,就必须先把它上方的货物一个个移动到临时区,直到它到达主库栈顶;
- 如果它在临时区中,就必须先把它上方的货物一个个移动回主库,直到它到达临时区栈顶;
- 当目标货物到达某个栈顶时,可以直接出库,不计入暂存次数。
每次为了取出当前最小目标货物而移动的阻挡货物都是无法避免的,因此该模拟得到最少暂存次数。
算法步骤
- 读取货物编号数组,数组从左到右表示主库底部到顶部。
- 将货物编号排序,得到目标出库顺序。
- 用两个栈分别表示主库和临时区。
- 依次处理目标编号:
- 若目标在主库,则将主库顶部阻挡货物移入临时区;
- 否则目标在临时区,则将临时区顶部阻挡货物移回主库;
- 目标到达栈顶后直接出库。
- 统计所有“主库到临时区”与“临时区到主库”的移动次数。
复杂度分析
设货物数量为 n。
- 时间复杂度:
O(n^2),每轮可能需要在线性栈中查找目标位置。 - 空间复杂度:
O(n),用于两个栈和排序后的目