通过率 48% · 提交 600 · 通过 285
小慕正在设计一个智能仓库的货架布局,为了让每个货架上的设备都能稳定运行,需要在每个货架旁边至少安装一个电源插座。 为了简化问题,假设仓库是一整排的,M表示货架,I表示空位,请你计算这整排货架,至少需要多少个电源插座。如果无法满足要求,请返回 -1。
这类题属于华为 OD 机考真题方向中「100分 / 贪心」方向的高频题型,通常考察对「100分 / 贪心」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
一行字符串cabinets,表示机房布局情况。 其中 M 表示机柜,I 表示间隔 1 ≤ strlen(cabinets) ≤ 10000 其中 cabinets[i] = 'M' 或者 'I'
一个正数,表示至少需要多少个电箱。
示例 1
输入示例
MIIM
输出示例
2
示例 2
输入示例
MIM
输出示例
1
示例 3
输入示例
M
输出示例
-1
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
这道题有点类似于 种花问题 和 【贪心】2024D-座位调整/2024D-找座位 这类型的贪心问题,需要我们在有限的间隔或者空间中,找到所使用电箱数量最少的最优解。
非常强烈建议大家再回顾一下上述题目,并比较上述题目和本题的相似性和区别。
考虑一种简单的场景。对于以下例子:
对于第一个 M,我们既可以在第一个 I 的位置(第一个 M 的左边)装上电箱,也可以在第二个 I 的位置(第一个 M 的右边)装上电箱。 显然,我们在第二个 `I` 的位置装上电箱更加划算,因为这个电箱不仅靠近第一个 M,也可以靠近第二个 M。
因此,如果我们从左到右、从前到后来遍历整个 cabinets 字符串,每当遇到一个机器 M,当其左右两边都有空位 I 的时候,我们总是会优先在其右边的空位安装电箱,因为这样有可能使得我们装下的这个电箱能够同时给另一个机器 M 供电。
在从左到右对 cabinets 字符串遍历的过程中,提出如下贪心策略:
I 直接跳过,索引前进一步:index += 1M 则考虑在其两侧中选择一侧装电箱如果 cabinets[index] == 'M' 的右边是一个空位 I,即 cabinets[index+1] == 'I' 成立:
index+1 的位置进行电箱安装,ans += 1index+2 的位置无论是 I 还是 M,都可以直接被跳过,因为如果 index+2 是 M 的话,也会被 index+1 处安装的电箱供电。index 可以前进三步,直接跳到 index+3 的位置,即 index += 3如果 cabinets[index] == 'M' 的右边是一个机器 M,而其左边是一个空位 I,即 cabinets[index-1] == 'I' and cabinets[index+1] == 'M' 成立:
M 右侧安装电箱),我们安装了电箱后直接跳过了 I 后面的位置(index += 3),因此当这种情况出现时,M 左边的 I 一定没有安装电箱(可以用反证法证明)index - 1 处安装电箱,index 前进一步到后面的机器 M 的位置,index += 1如果 cabinets[index] == 'M' 的左右两边都是机器 M,则无法完成布局,修改 ans 为 -1 后退出循环。
由于上述过程中 index 的前进步数不确定,因此需要在一个 while 循环中执行上述过程。整体代码框架如下:
上述代码可能需要取用 index+1 和 index-1。为了避免写出冗余的关于越界判断的条件语句,常用的技巧是在原 cabinets 字符串的前后各自加上一个无关字符串,例如 "A",这样可以有效地避免反复的越界判断。代码框架可以修改为:
注意:用了上述技巧之后,index 的初始化就要从 1 开始,而 while 的条件也要相应地修改为 index < n-1。同时,在条件语句中得用 cabinets[index-1] != "I" 和 cabinets[index+1] != "I" 来判断 index 的前后是否有空位。
将上述代码框架中的 pass 内容进行填充,得到以下完整代码:
复杂度分析 设 n 为输入字符串 cabinets 的长度。
登录后查看完整代码与视频精讲
完整标准代码、多解法对比、复杂度分析与视频精讲,由华为OD训练营老师带你逐行拆解。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
示例 4
输入示例
MMM
输出示例
-1
示例 5
输入示例
I
输出示例
0
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有