给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数
- 示例
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
思路
当我们将数组的元素向右移动 k 次后,尾部k mod n
个元素会移动至数组头部,其余元素向后移动 k mod n
个位置。
因此我们可以使用数组翻转的方法:
- 将所有元素翻转,这样尾部的
k mod n
个元素就被移至数组头部。 - 然后我们再翻转
[0,(k mod n)−1]
区间的元素和[k mod n,n−1]
区间的元素,即可得到最后的答案。
接下来使用示例中的例子来进行展示:
操作 | 结果 |
---|---|
原始数组 | 1,2,3,4,5,6,7 |
翻转所有元素 | 7,6,5,4,3,2,1 |
翻转 [0,(k mod n)−1] 区间的元素 | 5,6,7,4,3,2,1 |
翻转 [k mod n,n−1] 区间的元素 | 5,6,7,1,2,3,4 |
- 代码实现
public void rotate(int[] nums, int k) {
int n = nums.length;
//k如果等于n,数组不用改变。当k大于n时,把k变为k%n即可。
k%=n;
reverse(nums,0,n-1);
reverse(nums,0,k-1);
reverse(nums,k,n-1);
}
//翻转数组
private void reverse(int[] nums, int start, int end) {
while (start<end){
int temp = nums[start];
nums[start] = nums[end];
nums[end] = start;
start++;
end--;
}
}