例如:数组0,1,2,3,4,5,6,7,8,9,10,11,12,要交换1,2子串和7,8,9子串的位置,形成0,7,8,9,3,4,5,6,1,2,10,11,12
由于不是链表,不能直接断链,相接,数组存在移动的问题,还要判断有没有重叠的问题,总体思路就是:
1)将1~9置逆
2)将1~3置逆
3)将4~7置逆
4)将8~9置逆
跟之前的数组旋转类似,那个由于是没有间隔的,所以只要置逆3次,这里中间可能有间隔,所以最多要做4次置逆,代码很简单:
1 public static void doAgainst(int[] a, int start, int end) { 2 int temp; 3 System.out.println("start = " + start + ", end = " + end); 4 while (start <= end) { 5 temp = a[start]; 6 a[start] = a[end]; 7 a[end] = temp; 8 start++; 9 end--; 10 } 11 } 12 13 public static void Merge1(int[] a, int x1, int x2, int x3, int x4) { 14 // 将x1~x2之间的字串和x3~x4之间的字串交换 15 int x12 = x2 - x1; 16 int x34 = x4 - x3; 17 doAgainst(a, x1, x4); 18 doAgainst(a, x1, x1 + x34); 19 doAgainst(a, x1 + x34 + 1, x3 + x34 - x12 - 1); 20 doAgainst(a, x3 + x34 - x12, x4); 21 }