|
|
package 第02期.mca_01;
|
|
|
|
|
|
public class Problem04_MinSwapStep {
|
|
|
|
|
|
// 一个数组中只有两种字符'G'和'B',
|
|
|
// 可以让所有的G都放在左侧,所有的B都放在右侧
|
|
|
// 或者可以让所有的G都放在右侧,所有的B都放在左侧
|
|
|
// 但是只能在相邻字符之间进行交换操作,请问请问至少需要交换几次,
|
|
|
public static int minSteps1(String s) {
|
|
|
if (s == null || s.equals("")) {
|
|
|
return 0;
|
|
|
}
|
|
|
char[] str = s.toCharArray();
|
|
|
int step1 = 0;
|
|
|
int gi = 0;
|
|
|
for (int i = 0; i < str.length; i++) {
|
|
|
if (str[i] == 'G') {
|
|
|
step1 += i - (gi++);
|
|
|
}
|
|
|
}
|
|
|
int step2 = 0;
|
|
|
int bi = 0;
|
|
|
for (int i = 0; i < str.length; i++) {
|
|
|
if (str[i] == 'B') {
|
|
|
step2 += i - (bi++);
|
|
|
}
|
|
|
}
|
|
|
return Math.min(step1, step2);
|
|
|
}
|
|
|
|
|
|
// 可以让G在左,或者在右
|
|
|
public static int minSteps2(String s) {
|
|
|
if (s == null || s.equals("")) {
|
|
|
return 0;
|
|
|
}
|
|
|
char[] str = s.toCharArray();
|
|
|
int step1 = 0;
|
|
|
int step2 = 0;
|
|
|
int gi = 0;
|
|
|
int bi = 0;
|
|
|
for (int i = 0; i < str.length; i++) {
|
|
|
if (str[i] == 'G') { // 当前的G,去左边 方案1
|
|
|
step1 += i - (gi++);
|
|
|
} else {// 当前的B,去左边 方案2
|
|
|
step2 += i - (bi++);
|
|
|
}
|
|
|
}
|
|
|
return Math.min(step1, step2);
|
|
|
}
|
|
|
|
|
|
// 为了测试
|
|
|
public static String randomString(int maxLen) {
|
|
|
char[] str = new char[(int) (Math.random() * maxLen)];
|
|
|
for (int i = 0; i < str.length; i++) {
|
|
|
str[i] = Math.random() < 0.5 ? 'G' : 'B';
|
|
|
}
|
|
|
return String.valueOf(str);
|
|
|
}
|
|
|
|
|
|
public static void main(String[] args) {
|
|
|
int maxLen = 100;
|
|
|
int testTime = 1000000;
|
|
|
System.out.println("测试开始");
|
|
|
for (int i = 0; i < testTime; i++) {
|
|
|
String str = randomString(maxLen);
|
|
|
int ans1 = minSteps1(str);
|
|
|
int ans2 = minSteps2(str);
|
|
|
if (ans1 != ans2) {
|
|
|
System.out.println("Oops!");
|
|
|
}
|
|
|
}
|
|
|
System.out.println("测试结束");
|
|
|
}
|
|
|
} |