题目描述:
    一个数组中只有两种字符’G’和’B’,
    可以让所有的G都放在左侧,所有的B都放在右侧
    或者可以让所有的G都放在右侧,所有的B都放在左侧
    但是只能在相邻字符之间进行交换操作,请问请问至少需要交换几次,
    普通解,看到题目中讲到“只能两两交换”可能会想到冒泡排序,但是时间复杂度过高N^2
    最优解:时间复杂度O(N)
    小小贪心+双指针:
    eg:
    BBGGBBGBG
    从左向右第一个出现的G一定放在排序后的第1的位置,
    从左向右第二个出现的G一定放在排序后的第2的位置,
    从左向右第三个出现的G一定放在排序后的第3的位置,
    后面的G没必要放在前面G的前面。
    最后G全部调到左边之后,B就一定在右侧了,不用管B了。
    同上将B放在左边G放在右边。

    1. public class Code04_MinSwapStep {
    2. public static int minSteps1(String s) {
    3. if (s == null || s.equals("")) {
    4. return 0;
    5. }
    6. char[] str = s.toCharArray();
    7. // G在左侧
    8. int step1 = 0;
    9. int gi = 0;
    10. for (int i = 0; i < str.length; i++) {
    11. if (str[i] == 'G') {
    12. step1 += i - (gi++);
    13. }
    14. }
    15. // B在左侧
    16. int step2 = 0;
    17. int bi = 0;
    18. for (int i = 0; i < str.length; i++) {
    19. if (str[i] == 'B') {
    20. step2 += i - (bi++);
    21. }
    22. }
    23. return Math.min(step1, step2);
    24. }
    25. // 可以让G在左,或者在右
    26. public static int minSteps2(String s) {
    27. if (s == null || s.equals("")) {
    28. return 0;
    29. }
    30. char[] str = s.toCharArray();
    31. int step1 = 0;
    32. int step2 = 0;
    33. int gi = 0;
    34. int bi = 0;
    35. for (int i = 0; i < str.length; i++) {
    36. if (str[i] == 'G') { // 当前的G,去左边 方案1
    37. step1 += i - (gi++);
    38. } else {// 当前的B,去左边 方案2
    39. step2 += i - (bi++);
    40. }
    41. }
    42. return Math.min(step1, step2);
    43. }
    44. // 为了测试
    45. public static String randomString(int maxLen) {
    46. char[] str = new char[(int) (Math.random() * maxLen)];
    47. for (int i = 0; i < str.length; i++) {
    48. str[i] = Math.random() < 0.5 ? 'G' : 'B';
    49. }
    50. return String.valueOf(str);
    51. }
    52. public static void main(String[] args) {
    53. int maxLen = 100;
    54. int testTime = 1000000;
    55. System.out.println("测试开始");
    56. for (int i = 0; i < testTime; i++) {
    57. String str = randomString(maxLen);
    58. int ans1 = minSteps1(str);
    59. int ans2 = minSteps2(str);
    60. if (ans1 != ans2) {
    61. System.out.println("Oops!");
    62. }
    63. }
    64. System.out.println("测试结束");
    65. }
    66. }