问题描述
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
题解
思路
其实向右移动 k 个位置,可以理解成将数组中后 k 个元素放置到数组开头位置。根据这个思路,我们完成以下步骤即可实现数组旋转。
- 声明一个临时数组,保存原数组中后 k 个元素;
- 将原数组所有元素向后移动 k 个位置;
- 将临时数组中保存的数据拷贝到原数组开头位置;
代码
class Solution {
public void rotate(int[] nums, int k) {
k = k % nums.length;
int[] temp = Arrays.copyOfRange(nums, nums.length - k, nums.length);
for (int i = nums.length-k-1; i >= 0; i--) {
nums[i+k] = nums[i];
}
for (int i = 0; i < k; i++) {
nums[i] = temp[i];
}
}
}
简化一下:
class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
int[] temp = Arrays.copyOfRange(nums, nums.length - k, nums.length);
System.arraycopy(nums, 0, nums, k, nums.length - k);
System.arraycopy(temp, 0, nums, 0, k);
}
}