算法通关村第三关——数组轮转问题

69 阅读1分钟

数组轮转问题

这道题目一开始的思路肯定是,将数组中每个元素一个一个移动位置;但是这样的代价很高;

那么我们应该怎么做才最节省时间,也比较高效呢?

首先将整个数组翻转,也就是 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);
}