2023华为OD机试真题-机房布局(JAVA、Python、C++)

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

输入描述:
cabinets = "MIIM"
其中M表示机柜,I表示间隔
输出描述:
2
表示至少需要2个电箱
补充说明:
1<= strlen(cabinets) <= 10000
其中 cabinets[i] = ‘M’ 或者 'I'
 收起
示例1
输入:
MIIM
输出:
2
说明:
示例2
输入:
MIM
输出:
1
说明:
示例3
输入:
M
输出:
-1
说明:
示例4
输入:
MMM
输出:
-1
说明:
示例5
输入:
I
输出:
0

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main{
    
    public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
        
        String string = sc.nextLine();
        
        int res = 0;
        for(int i=0;i<string.length();i++){
            
            char c =string.charAt(i);
            
            if(c =='M'){
                if(i+1<string.length()&&string.charAt(i+1)=='I'){
                    res ++;
                    i+=2;
                }else if(i-1>=0&&string.charAt(i-1)=='I'){
                    res ++;
                }else{
                    res = -1;
                    break;
                }
            }
        }
        System.out.println(res);
    }     
    
}
import sys
 
def get_num(s):
    if len(s) < 1:
        return 0
    
    n_s = s.replace("MIM", "S")
    
    res = (len(s)-len(n_s))/2
    
    d_s = n_s.replace("MI", "S")
    res = res + len(n_s)-len(d_s)
    
    f_s = d_s.replace("IM", "S")
    res = res + len(d_s)-len(f_s)
    
    if "M" in f_s:
        res = -1
    
    print(int(res))
        
            
        
 
 
for line in sys.stdin:
    s = line.strip()
    get_num(s)
#include <iostream>
using namespace std;
int main()
{
    string s;
    getline(cin,s);
    int sum=0;
    int flag1=0,flag2=0;
    int a[10001];
    for(int i=0;i<10000;i++) a[i]=0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='M') flag1=1;
        if(s[i]=='I') flag2=1;
        if(s[i]=='M'&&s[i+1]=='I')
        {
            if(!a[i]&&!a[i+1])
            {
                if(s[i-1]!='I'||(s[i-1]=='I'&&!a[i-1])) 
                {
                    sum++;
                    a[i+1]=1;
                }
            }
            a[i]=1;
        }
        if(s[i]=='M'&&s[i-1]=='I')
        {
            if(!a[i-1]&&!a[i]) 
            {
                if(s[i+1]!='I'||(s[i+1]=='I'&&!a[i+1])) 
                {
                    sum++;
                    a[i-1]=1;
                }
            }
            a[i]=1;
        }
    }
    if(flag1&&!flag2) cout<<-1;
    if(!flag1&&flag2) cout<<0;
    if(sum>=0&&flag1&&flag2) cout<<sum;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值