华为OD题目:机房布局
知识点数组贪心Q
时间限制: 1s 空间限制: 256MB 限定语言: 不限
题目描述:
小明正在规划一个大型数据中心机房,为了使得机柜上的机器都能正常满负荷工作,需要确保在每个机柜边上至少要为了简化题目,
假设这个机房是一整排,M表示机柜,l表示间隔,请你返回这整排机柜,至少需要多少个电箱。如
有一个电箱。
果无解请返回 -1 。
输入描述:
cabinets =“MIlM”
其中M表示机柜,表示间隔
输出描述:
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
解题思路:
- 遍历宁符串
- 当碰到M时,先看后面的值是否为I:
- 如果是1,则直接安装电箱,且紧接的后面可以共用此电箱,所以不需要管,索引+2.
- 如果不是1,则查看前面的是否为I:
- 如果是I,则在前面安装电箱。
- 如果也不是I,则返回-1,表示无解.
public class My {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
char[] chars = line.toCharArray();
int length = chars.length;
int result = 0;
for (int i = 0; i < length; i++) {
char cur = chars[i];
if (cur != 'M') {
continue;
}
//如果当前是M,则看下一个是否是M,如果是空白,那么
if (i + 1 < length && chars[i + 1] == 'I') {
//那么把物品放置在空格里面
result++;
i += 2;
} else if (i - 1 >= 0 && chars[i - 1] == 'I') {
result++;
}else {
result = -1;
break;
}
}
System.out.println(result);
}
}