题目
分析
首先能想到的就是可以用一个新数组,先保存原数组的后 k 个元素,再保存原数组的前 n−k 个元素。但题目要求不使用额外的数组空间,那么就需要在原数组上做操作。
我们可以先把整个数组翻转一下,这样后半段元素就到了前边,前半段元素就到了后边,只不过元素顺序是反着的。我们再从 k 位置分隔开,将 [0…k−1] 区间上的元素和 [k…n−1] 区间上的元素再翻转一下,就得到了最终结果。
以 LeetCode的例1 我们来看一下这个过程:
代码
class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums,0,nums.length - 1);
reverse(nums,0,k-1);
reverse(nums,k,nums.length - 1);
}
void reverse(int[] nums,int start,int end) {
while(start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start+=1;
end -= 1;
}
}
}