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 号

  • 操作过程:

    1. 顶部是 2 号,但目标需要 1 号,将 2 号暂存到临时区(暂存次数 = 1)
    2. 顶部是 1 号,直接出库 → 已出库:[1 号]
    3. 临时区顶部是 2 号,出库 → 已出库:[1 号, 2 号]
    4. 货物堆顶部是 3 号,出库 → 已出库:[1 号, 2 号, 3 号]
  • 最少暂存次数:1

示例2

输入

1,2,3

输出

2

说明

  • 货物堆初始状态(底部→顶部):[1 号, 2 号, 3 号],顶部货物为 3 号

  • 目标出库顺序:1 号 → 2 号 → 3 号

  • 操作过程:

    1. 顶部是 3 号,但目标需要 1 号,将 3 号暂存(次数 = 1)
    2. 顶部是 2 号,但目标需要 1 号,将 2 号暂存(次数 = 2)
    3. 顶部是 1 号,直接出库
    4. 临时区顶部是 2 号,出库
    5. 临时区顶部是 3 号,出库
  • 最少暂存次数:2

示例3

输入

6,5,2,4,3,1

输出

3

说明

  • 货物堆初始状态(底部→顶部):[6,5,2,4,3,1],顶部为 1 号

  • 目标出库顺序:1 → 2 → 3 → 4 → 5 → 6

  • 操作过程:

    1. 主库顶部 1 号,直接出库 → 主库:[6,5,2,4,3],临时:[]
    2. 目标 2 号在主库深度 2(上方隔着 3 和 4),将 3、4 暂存到临时区,暂存次数 = 2 → 主库:[6,5],临时:[3,4](顶)
    3. 主库顶部 2 号,直接出库 → 主库:[6,5]
    4. 目标 3 号在临时区深度 1(上方隔着 4),将 4 暂存回主库,暂存次数 = 3 → 主库:[6,5,4],临时:[3](顶)
    5. 临时区顶部 3 号,直接出库
    6. 主库顶部 4 号,直接出库
    7. 主库顶部 5 号,直接出库
    8. 主库顶部 6 号,直接出库
  • 最少暂存次数:3

  • 关键:第 4 步体现了双向暂存的价值 —— 将临时区的 4 移回主库,释放 3 出库。若无双向暂存,此场景无法解决。

解题思路

核心思想

主库和临时区都可以看成栈,栈顶是当前唯一能直接操作的位置。目标出库顺序是所有货物编号从小到大排序后的结果。

对于当前要出库的货物 target:

  • 如果它在主库中,就必须先把它上方的货物一个个移动到临时区,直到它到达主库栈顶;
  • 如果它在临时区中,就必须先把它上方的货物一个个移动回主库,直到它到达临时区栈顶;
  • 当目标货物到达某个栈顶时,可以直接出库,不计入暂存次数。

每次为了取出当前最小目标货物而移动的阻挡货物都是无法避免的,因此该模拟得到最少暂存次数。

算法步骤

  1. 读取货物编号数组,数组从左到右表示主库底部到顶部。
  2. 将货物编号排序,得到目标出库顺序。
  3. 用两个栈分别表示主库和临时区。
  4. 依次处理目标编号:
    • 若目标在主库,则将主库顶部阻挡货物移入临时区;
    • 否则目标在临时区,则将临时区顶部阻挡货物移回主库;
    • 目标到达栈顶后直接出库。
  5. 统计所有“主库到临时区”与“临时区到主库”的移动次数。

复杂度分析

设货物数量为 n。

  • 时间复杂度:O(n^2),每轮可能需要在线性栈中查找目标位置。
  • 空间复杂度:O(n),用于两个栈和排序后的目
THE END