189 Rotate Array 旋转数组

将包含 n 个元素的数组向右旋转 k 步。
例如,如果  n = 7 ,  k = 3,给定数组  [1,2,3,4,5,6,7]  ,向右旋转后的结果为 [5,6,7,1,2,3,4]。
注意:
尽可能找到更多的解决方案,这里最少有三种不同的方法解决这个问题。

详见:https://leetcode.com/problems/rotate-array/description/

Java实现:

方法一:

class Solution {
    public void rotate(int[] nums, int k) {
        int n=nums.length;
        k%=n;
        reverseArray(nums,0,n-1);
        reverseArray(nums,0,k-1);
        reverseArray(nums,k,n-1);
    }
    private void reverseArray(int[] nums,int start,int end){
        while(start<end){
            nums[start]=nums[start]+nums[end];
            nums[end]=nums[start]-nums[end];
            nums[start]=nums[start]-nums[end];
            ++start;
            --end;
        }
    }
}

方法二:

class Solution {
    public void rotate(int[] nums, int k) {
        int n=nums.length;
        int[] copy=Arrays.copyOf(nums,n);
        for(int i=0;i<n;++i){
            nums[(i+k)%n]=copy[i];
        }
    }
}

方法三:

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        int start = 0;
        while (n != 0 && (k %= n) != 0) {
            for (int i = 0; i < k; ++i) {
                swap(nums, i + start, n - k + i + start);
            }
            n -= k;
            start += k;
        }
    }

    private void swap(int[] nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
}

参考:https://www.cnblogs.com/grandyang/p/4298711.html

原文地址:https://www.cnblogs.com/xidian2014/p/8745278.html