一、题目描述
机房布局问题描述如下:
小明正在规划一个大型数据中心机房,为了使得机柜上的机器都能正常满负荷工作,需要确保在每个机柜边上至少要有一个电箱。为了简化题目,假设这个机房是一整排,M表示机柜,I表示间隔,要求返回整排机柜至少需要多少个电箱。如果无解则返回-1。
二、输入描述
一个字符串cabinets,其中M表示机柜,I表示间隔。字符串长度满足1 ≤ strlen(cabinets) ≤ 10000。
例如: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
示例6
输入:
IMIMIIMIMMI
输出:
3
说明:M是机柜,旁边必须有一个电箱,同时题目要求最少的电箱。那其实MIM这样的摆放比MIIM少用一个电箱。拿例子6来看,在3个位置放电箱,分别是 MIM,MIM,MI。这三个地方,不仅可以保证机箱正常运作,还可以使电箱最少。
五、解题思路
- 遍历字符串cabinets,检查每个字符。
- 当遇到字符'M'时,判断其前面或后面是否有字符'I'。
- 如果'M'后面有'I',但前面没有'I',则取后面一个'I',组成一个有效的电箱。
- 如果'M'后面没有'I',但前面有'I',则取前面一个'I',组成一个有效的电箱。
- 如果'M'后面有'I',但前面也有'I',那我们去判断前面‘I’之前是不是M?如果是‘M’就取前一个‘I’,如果不是就取后一个‘I’,组成一个有效的电箱。
- 如果'M'前面和后面都没有'I',则无法组成有效的电箱,返回-1。
- 统计并返回有效的电箱数量。
Java代码
package odTest;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class computeHouseLayout {
public static void main(String[] args) {
String str = "IMIMIIMIMMI";
Scanner scanner= new Scanner(System.in);
String input = scanner.nextLine();
if(!input.contains("M")) {
System.out.println(0);
System.exit(0);
}
if(input.endsWith("MM")||input.startsWith("MM")||input.contains("MMM")||!input.contains("I")) {
System.out.println(-1);
System.exit(0);
}
Set<Integer> usedIndex = new HashSet<>();
for(int i = 0;i<input.length();i++) {
if(i>=input.length()) {
break;
}
if(i==input.length()-1) {
break;
}
if(input.charAt(i)=='M'&&input.charAt(i+1)!='I'&&input.charAt(i-1)=='I') {
usedIndex.add(i-1);
}
if(input.charAt(i)=='M'&&input.charAt(i+1)=='I'&&input.charAt(i-1)=='I') {
if(i>2&&input.charAt(i-2)=='M') {
usedIndex.add(i-1);
}else {
usedIndex.add(i+1);
}
}
if(input.charAt(i)=='M'&&input.charAt(i+1)=='I'&&input.charAt(i-1)!='I') {
usedIndex.add(i+1);
}
}
// usedIndex.forEach(m->{
// System.out.println(m);
// });
System.out.println(usedIndex.size());
}
}