旋转数组

旋转数组

问题

这个题目说的是,给你一个数组和一个数字 k,你要把数组右边的数字旋转到数组左边,一次旋转一个数字,共旋转 k 次。

比如说,给你的数组是:

0, 1, 2, 4, 8

给你的数字 k 是 3:

k = 3

把数组右边的数字一个个旋转到左边,操作 3 次。先是 8,然后 4,最后是 2。剩下的 0 和 1 保持不动。最后得到旋转后的数组是:

2, 4, 8, 0, 1

代码

public class AlgoCasts {

  // Time: O(n), Space: O(n)
  public void rotateByCopy(int[] nums, int k) {
    if (nums == null || nums.length == 0 || k <= 0) return;
    int n = nums.length, m = k % n, i = 0;
    int[] t = new int[n];
    for (int j = n-m; j < n; ++j) t[i++] = nums[j];
    for (int j = 0; j < n-m; ++j) t[i++] = nums[j];
    for (int j = 0; j < n; ++j) nums[j] = t[j];
  }

  private void reverse(int[] nums, int i, int j) {
    for (; i < j; ++i, --j) {
      int tmp = nums[i];
      nums[i] = nums[j];
      nums[j] = tmp;
    }
  }

  // Time: O(n), Space: O(1)
  public void rotateBySwap(int[] nums, int k) {
    if (nums == null || nums.length == 0 || k <= 0) return;
    int n = nums.length, m = k % n;
    reverse(nums, 0, n-1);
    reverse(nums, 0, m-1);
    reverse(nums, m, n-1);
  }

}

  转载请注明: ForwardXu 旋转数组

 上一篇
硬币面值组合问题 硬币面值组合问题
硬币面值组合问题问题 这个题目说的是,给你一些面值不同的硬币,每一种面值的硬币都有无限多个,现在你要用这些硬币组成一个给定的数值,那么请问,总共有多少种可能的组合方式? 比如说,给你的硬币有 1 分 2 分两种面值,现在你要用它们凑 4 分
2019-01-06
下一篇 
旋转二维数组 旋转二维数组
求和为给定值的组合问题 这个题目说的是,给你一个 n x n 的二维数组,你要沿顺时针方向将它旋转 90 度。要求你不能使用额外的存储空间,就地在原数组操作。 比如说,给你的二维数组是: 1, 2, 3 4, 5, 6 7, 8, 9
2019-01-06
  目录