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