数组轮转问题
这道题目一开始的思路肯定是,将数组中每个元素一个一个移动位置;但是这样的代价很高;
那么我们应该怎么做才最节省时间,也比较高效呢?
首先将整个数组翻转,也就是 0 位置的元素和arr.length-1位置的元素交换,1位置的元素和arr.length-2位置的元素交换。。。。
然后找到第k个位置,将整个数组看作是两个区间 [0,k-1] [k,arr.length-1]; 然后再将这两个区间的数分别翻转,即可得到结果
比如:给定数组 [1,2,3,4,5,6,7];
1.翻转整个数组 得到 [7,6,5,4,3,2,1];
2.找到第k个数,将整个数组分为两个区间 [7,6,5] [4,3,2,1];
3.分别翻转上面的两个区间得到 [5,6,7] [1,2,3,4];
最终得到结果就是题目所需的结果;很神奇!!!
代码如下:
public static void rotate(int[] arr, int k) {
k %= arr.length;
reverse(arr, 0, arr.length - 1);
reverse(arr, 0, k - 1);
reverse(arr, k, arr.length - 1);
}
// 翻转数组
public static void reverse(int[] arr, int start, int end) {
while (start < end) {
swap(arr,start++,end--);
}
}
// 交换数组中两个位置的元素
public static void swap(int[] arr,int left,int right){
arr[left]=arr[left]^arr[right];
arr[right]=arr[left]^arr[right];
arr[left]=arr[left]^arr[right];
}
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6,7};
rotate(arr,3);
}