某公司员工到餐厅吃饭,吃饭要排队。因为公司的员工都是有素质的,让女同事排在队伍的前面。只要男同事发现自己的后面是一位女同事的话,该男同事将会与后面的女同事调换位置,调换位置需要1秒钟的时间。在同一时间可能会有多位男同事与后面女同事调换位置。我们需要求队伍调整完毕需要的总时间。M代表男同事,F代表女同事,排队顺序使用字符串,字符串的开头代表队伍的最前面。现在举个例子,假设初始的队伍是”MFMF“,那么第一秒中将有两位男同事与后面的女同事调换位置,此时的队伍变成”FMFM“,然后再接下来的一秒钟有一位男同事与后面女同事调换位置,现在队伍就变成”FFMM“,这样所有的女同事都排在男同事的前面,总时间用了2秒钟。(本题来源于互联网)
1.求出所有字串"MF"在队伍的位置
public static List<Integer> getIndex(String str) {
List<Integer> list = new ArrayList<Integer>();
for (int index = 0; index < str.length();) {
int j = str.indexOf("MF", index);
if(j==-1)
break;
list.add(j);
index = j + 2;
}
return list;
}
2.一次调换位置
public static String replace(String str, List<Integer> list) {
char[] c = str.toCharArray();
for (int i = 0; i < list.size(); i++) {
c[list.get(i)] = 'F';
c[list.get(i) + 1] = 'M';
}
return new String(c);
}
3.计算"MF"在队伍中出现的次数
public static Integer getCount(String str) {
Integer i = 0;
for (int index = 0; index < str.length();) {
int j=str.indexOf("MF", index);
if(j==-1)
break;
i++;
index = j + 2;
}
return i;
}
4.递归求出队伍好调整需要的总时间
public static Integer getResult(String str) {
if (getCount(str) == 0) {
return 0;
}
return getResult(replace(str, getIndex(str)))+1;
}