当前位置: 首页 > news >正文

【华为OD-E卷 - 机房布局 100分(python、java、c++、js、c)】

【华为OD-E卷 - 机房布局 100分(python、java、c++、js、c)】

题目

小明正在规划一个大型数据中心机房,为了使得机柜上的机器都能正常满负荷工作,需要确保在每个机柜边上至少要有一个电箱。
为了简化题目,假设这个机房是一整排,M表示机柜,I表示间隔,请你返回这整排机柜,至少需要多少个电箱。 如果无解请返回 -1 。

输入描述

  • cabinets = “MIIM”

其中 M 表示机柜,I 表示间隔

输出描述

  • 表示至少需要2个电箱

备注

  • 1 ≤ strlen(cabinets) ≤ 10000 其中 cabinets[i] = ‘M’ 或者 ‘I’

用例

用例一:
输入:
MIIM
输出:
2
用例二:
输入:
MIM
输出:
1
用例三:
输入:
M
输出:
-1
用例四:
输入:
MMM
输出:
-1

python解法

  • 解题思路:
  • 输入的字符串 s 代表一个排列,其中字符 ‘M’ 和 ‘I’ 代表物品和箱子。
    目标是通过判断字符 ‘M’ 和 ‘I’ 的相对位置来计算可以形成多少对 “箱子”。
    每对 “箱子” 由一个 ‘M’ 和一个 ‘I’ 组成,可以是 ‘M’ 在前,‘I’ 在后;也可以是 ‘I’ 在前,‘M’ 在后。
    遍历字符串,如果当前字符是 ‘M’,则检查其左右相邻的字符是否是 ‘I’,并确保不会重复计算。
    如果找不到匹配的 ‘I’ 或者有不符合条件的字符排列,则返回 -1。
s = input()def calc_boxes(s):l = len(s)  # 获取字符串长度count = 0  # 初始化箱子计数i = 0  # 初始化遍历索引while i < l:  # 使用while循环遍历字符串if s[i] == 'M':  # 如果当前字符是'M'if i + 1 < l and s[i + 1] == 'I':  # 如果'M'后面是'I'count += 1  # 找到一对箱子,计数加1i += 2  # 跳过这对'M'和'I',继续检查下一个字符elif i - 1 >= 0 and s[i - 1] == 'I':  # 如果'M'前面是'I'count += 1  # 找到一对箱子,计数加1i += 1  # 跳过当前的'M',继续检查下一个字符else:return -1  # 如果'M'没有配对的'I',返回-1else:i += 1  # 如果当前字符不是'M',继续向后遍历return count  # 返回找到的箱子对数print(calc_boxes(s))  # 输出结果

java解法

  • 解题思路
  • 给定一个字符串,其中字符 ‘M’ 表示机器,字符 ‘I’ 表示电箱。目标是计算出能够组成多少个机器与电箱的配对,且每个配对必须由一个 ‘M’ 和一个 ‘I’ 组成。
    配对时,优先选择将 ‘M’ 与其右侧的 ‘I’ 配对,如果右侧没有 ‘I’,则尝试与左侧的 ‘I’ 配对。
    如果无法找到任何有效的配对,则返回 -1。
    遍历字符串时,如果 ‘M’ 已经与电箱配对成功,则跳过这部分字符,继续检查下一个可能的配对
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String input = sc.next();  // 输入字符串System.out.println(getMinBoxes(input));  // 输出最小电箱数}// 主函数用于返回最小电箱数public static int getMinBoxes(String str) {return countValidBoxes(str);  // 调用辅助方法进行电箱数计算}// 计算有效的电箱对数private static int countValidBoxes(String str) {int length = str.length();  // 获取字符串长度int totalBoxes = 0;  // 初始化电箱计数器// 遍历字符串,根据规则判断电箱放置for (int i = 0; i < length; i++) {if (isMachine(str, i)) {  // 判断当前字符是否是机器 'M'// 尝试优先放置右边的电箱if (canPlaceRight(str, i)) {totalBoxes++;  // 成功放置电箱,更新电箱计数i += 2;  // 跳过已处理的部分,移动索引}// 若不能放置右边,尝试放置左边else if (canPlaceLeft(str, i)) {totalBoxes++;  // 成功放置电箱,更新电箱计数}// 两边都无法放置电箱,则返回 -1else {return -1;}}}return totalBoxes;  // 返回总的电箱数量}// 判断当前位置字符是否是机器 'M'private static boolean isMachine(String str, int index) {return str.charAt(index) == 'M';  // 如果字符为 'M' 返回 true}// 判断能否在右边放置电箱private static boolean canPlaceRight(String str, int index) {return index + 1 < str.length() && str.charAt(index + 1) == 'I';  // 判断右边是否是 'I'}// 判断能否在左边放置电箱private static boolean canPlaceLeft(String str, int index) {return index - 1 >= 0 && str.charAt(index - 1) == 'I';  // 判断左边是否是 'I'}
}

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

更新中

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

http://www.lryc.cn/news/513263.html

相关文章:

  • 【竞技宝】LOL:IG新赛季分组被质疑
  • ChatBI来啦!NBAI 正式上线 NL2SQL 功能
  • 8. Web应用程序(Web)
  • Linux内核修改内存分配策略
  • 六大亮点解析:AI视频监控助力部队训练安全管理
  • 【从零开始入门unity游戏开发之——C#篇33】C#委托(`Delegate`)和事件(`event` )、事件与委托的区别、Invoke()的解释
  • 大数据与机器学习(它们有何关系?)
  • 深入浅出 Spring(一) | Spring简介、IOC理论推导、快速上手 Spring
  • IDEA 社区版 SpringBoot不能启动
  • 职场常用Excel基础01-数据验证
  • 活动预告 |【Part1】Microsoft Azure 在线技术公开课:数据基础知识
  • RabbitMQ - 1 ( 7000 字 RabbitMQ 入门级教程 )
  • Docker Compose 构建 EMQX 集群 实现mqqt 和websocket
  • Spring 过滤器:OncePerRequestFilter 应用详解
  • 3.CSS字体属性
  • 微信小程序 单选多选radio/checkbox 纯代码分享
  • k8s 部署meilisearch UI
  • gitlab 还原合并请求
  • ChatGPT最新版本“o3”的概要
  • uniapp——App下载文件,保存、打开文件(二)
  • Postman接口测试05|实战项目笔记
  • 【paddle】初次尝试
  • 01-2023年上半年软件设计师考试java真题解析
  • 一文讲清楚CSS3新特性
  • 系统设计案例:设计 Spotify
  • 太速科技-633-4通道2Gsps 14bit AD采集PCie卡
  • 图片叠加拖拽对比展示效果实现——Vue版
  • 结合长短期记忆网络(LSTM)和无迹卡尔曼滤波器(UKF)的技术在机器人导航和状态估计中的应用前景
  • 【MATLAB APP Designer】小波阈值去噪(第一期)
  • ClickHouse副本搭建