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

【华为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  # 找到一对箱子,计数加1
                i += 2  # 跳过这对'M'和'I',继续检查下一个字符
            elif i - 1 >= 0 and s[i - 1] == 'I':  # 如果'M'前面是'I'
                count += 1  # 找到一对箱子,计数加1
                i += 1  # 跳过当前的'M',继续检查下一个字符
            else:
                return -1  # 如果'M'没有配对的'I',返回-1
        else:
            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++;  // 成功放置电箱,更新电箱计数
                }
                // 两边都无法放置电箱,则返回 -1
                else {
                    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.kler.cn/a/460370.html

相关文章:

  • 41.5 nginx拦截prometheus查询请求使用lua脚本做promql的检查替换
  • MySQL 入门大全:运算符
  • liunx下载gitlab
  • Linux -- 单例模式
  • Spring Boot日志处理
  • GDPU 数据库原理 期末复习
  • Edge如何获得纯净的启动界面
  • XIAO Esp32 S3 轻松发送 HTTP 请求,打造智能物联网应用
  • 优化咨询行业团队协作:通过有效的项目管理工具实现高效协作
  • 爬虫代码中如何添加异常处理?
  • torch.nn.Linear(p_input, p_output,bias)
  • 2024Jinger的前端学习内容总结——前端学习路线(超全)
  • 使用 Python 和 LabelMe 实现图片验证码的自动标注
  • 【ArcGISPro/GeoScenePro】检查多光谱影像的属性并优化其外观
  • Spring Boot 3 文件上传、多文件上传、大文件分片上传、文件流处理以及批量操作
  • WPF系列五:图形控件Ellipse
  • log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件
  • 自己编写甘特图的绘制程序
  • golang 熔断限流降级
  • 商汤C++开发面试题及参考答案
  • 【postgresql 物化视图】自动刷新物化视图2种方法
  • order by语句执行顺序
  • Vue2/Vue3使用DataV
  • .net core 的数据库编程
  • swiftui开发页面加载发送请求初始化@State变量
  • flash-attention保姆级安装教程