问题描述

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

题解

思路

其实向右移动 k 个位置,可以理解成将数组中后 k 个元素放置到数组开头位置。根据这个思路,我们完成以下步骤即可实现数组旋转。

  1. 声明一个临时数组,保存原数组中后 k 个元素;
  2. 将原数组所有元素向后移动 k 个位置;
  3. 将临时数组中保存的数据拷贝到原数组开头位置;

旋转数组 - 图1

代码

  1. class Solution {
  2. public void rotate(int[] nums, int k) {
  3. k = k % nums.length;
  4. int[] temp = Arrays.copyOfRange(nums, nums.length - k, nums.length);
  5. for (int i = nums.length-k-1; i >= 0; i--) {
  6. nums[i+k] = nums[i];
  7. }
  8. for (int i = 0; i < k; i++) {
  9. nums[i] = temp[i];
  10. }
  11. }
  12. }

简化一下:

  1. class Solution {
  2. public void rotate(int[] nums, int k) {
  3. k %= nums.length;
  4. int[] temp = Arrays.copyOfRange(nums, nums.length - k, nums.length);
  5. System.arraycopy(nums, 0, nums, k, nums.length - k);
  6. System.arraycopy(temp, 0, nums, 0, k);
  7. }
  8. }