Given a descending array A, reorder it to: Ln→L0→Ln-1→L1→Ln-2→L2→…
e.g. A = [7, 6, 5, 4, 3, 2, 1] → A = [1, 7, 2, 6, 3, 5, 4]
NOTICE: do this with only O(1) memory space and in O(n) time complexity.
public void change(int[] arr){
int start = 0;
int end = arr.length - 1;
int seg = arr.length / 3;
//System.out.println("seg : " + seg);
reverse(arr, start, end);
start += 2;
reverse(arr, start, end);
for(int i = 0; i < seg; i++){
start += 3;
reverse(arr, start, end);
}
int point = 1;
for(int i = 0; i < seg; i++){
swap(arr, point + i * 3, point + i * 3 + 1);
}
}
private void reverse(int[] arr, int start, int end){
while(start < end){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}