首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-03-07 19:21
  • 2381
  • 5339
blog.csdn.net

【华为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
  • 1
输出:
2
  • 1
用例二:
输入:
MIM
  • 1
输出:
1
  • 1
用例三:
输入:
M
  • 1
输出:
-1
  • 1
用例四:
输入:
MMM
  • 1
输出:
-1
  • 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))  # 输出结果

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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'
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

C++解法

  • 解题思路
更新中
  • 1

C解法

  • 解题思路

更新中
  • 1

JS解法

  • 解题思路

更新中
  • 1

注意:

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

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144834779"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top