Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7]
is rotated to [5,6,7,1,2,3,4]
.
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Hint:
Could you do it in-place with O(1) extra space?
Could you do it in-place with O(1) extra space?
Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.
本题属于数组操作类的题目。可以查看下Collections.rotate()方法,会得到一些启示,但是本文使用的是一个截取的思路;需要注意的是移动元素的次数可能是数组长度很多倍,即存在循环移动。
<pre name="code" class="java"><span style="font-size:14px;">public static void rotate(int[] nums, int k) {
int leng = nums.length;
if (leng == 0 || (k % leng == 0)) {
return;
}
//需要考虑循环移动的情况,即k>leng
k = k % nums.length;
//构建出[1,2,3,4,5,6,7]的复制数组[1,2,3,4,5,6,7,1,2,3,4,5,6,7],然后从index为k开始截取到leng长度即可
int[] temp = new int[leng * 2];
for (int i = 0; i < leng; i++) {
temp[i] = nums[i];
temp[i + leng] = nums[i];
}
int startindex = leng - k;
for (int i = 0; i < leng; i++) {
nums[i] = temp[startindex];
startindex++;
}
}
</span>