华为 · 模拟 · 算法编程题
华为 模拟 时限 3 秒 / 256 MB

题目描述

在一座名为“星环”的巨大环形空间站上,资源仓呈线性排列,首尾相连。
现需要为一艘抵达的货运船,请求一段连续的空闲资源仓用于停靠。
星环的状态由一个十进制 `byte` 序列描述。
序列中的每个数字代表一个“监控单元”,对应着 8 个连续的资源仓。
该数字的二进制表示中的每一位 (`bit`) 描述了一个资源仓的状态:`1` 代表“空闲”,`0` 代表“已被占用”。
为便于管理,所有资源仓从 0 开始统一编号。
若监控单元序列共有 N 个数字,则第一个数字的 `bit 0` 到 `bit 7` 对应 0 7 号资源仓,第二个数字对应 8 15 号,以此类推。
第 N 个数字对应 8N-8 8N-1 号资源仓。
0 号和 8N-1 号资源仓在物理上是相邻的,共同构成了星环的闭环。
货运船当前停靠在 m 号资源仓附近,需要从此位置之后(顺时针方向)寻找一片长度为 k 的连续空闲资源仓。分配时需遵循以下优先级规则:
1. 搜索顺序 :从 m+1 号资源仓开始,按编号递增方向( [m+1, 8N-1] )进行搜索。若未找到,则回到星环起点,继续搜索 [0, m] 区间。
2. 最优匹配 (Best-Fit) :如果找到多个满足长度要求的连续空闲仓段,优先选择长度最接近 k 的仓段。
3. 最近原则 (Nearest-First) :在所有“最优匹配”的仓段中,选择起始编号离 m **距离最近**的一个。
4. 距离计算 :设候选仓段的起始编号为 j ,总仓位数为 8N 。
- 若 j > m ,距离为 j - m 。
- 若 j ≤ m ,距离为 (j + 8N) - m 。(计算回环距离)

输入输出

输入描述
输入为一个数字序列,包含两部分:
1. 第一行 :包含两个整数,分别为:
k :请求的连续资源仓数量,范围 [0, 65535] 。
m :当前停靠的资源仓编号,范围 [0, 3600] 。
2. 第二行及之后 :描述星环状态的 `byte` 序列(最多 500 个数字),数字之间由空格或换行符分隔,每个数字的范围是 [0, 255] 。
输出描述
输出一个整数,表示最终分配的资源仓段的 起始编号 。
如果无法找到满足条件的资源仓段,则输出 -1 。

样例共 3 组

样例 1
输入
3 6
59 143
输出
15
样例 2
输入
3 1
0 0
输出
-1
样例 3
输入
3 1
61 7
输出
8

算法解析依据充分

考点:模拟

限制 3 秒 / 256MB | 标准输入输出

题目画像

  • 源站时限:3 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:模拟

本题切入点

把字节序列展开成位图后在环上搜索:从 m+1 起环形扫描所有长度 ≥k 的空闲段,按「长度最接近 k → 起点离 m 最近」排序取最优,找不到输出 −1。

不涉及复杂算法,把题目描述的流程原样翻译成代码逐步执行即可。

思路框架(模拟 通法 · 非本题专属)

  1. 用变量记录题目要求的「状态」(当前值、剩余数量、当前位置等)。
  2. 按题面给出的顺序,把每一步操作写成一段代码,逐条执行。
  3. 每一步执行后更新状态,并在题目要求的位置输出或累计答案。
  4. 注意循环的边界:执行多少次、何时终止、是否能终止。

实现要点:结构上通常是一个外层循环包住若干 if/else 分支;只要状态定义清楚,正确率很高。

复杂度:时间 O(操作次数) | 空间 O(状态数)

该范式的通法易错点

  • 终止条件写错导致死循环或漏做最后一次操作。
  • 状态更新顺序颠倒(先改了下标又用旧下标)。
  • 题目里「最多 / 恰好 / 至少」的语义差别没区分。

样例

样例 1

  • 输入:3 6 / 59 143
  • 输出:15

样例 2

  • 输入:3 1 / 0 0
  • 输出:-1

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-11月12号开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解