美文网首页工作生活
数组 / Q189: 旋转数组

数组 / Q189: 旋转数组

作者: 原创迷恋者 | 来源:发表于2019-07-02 16:52 被阅读0次

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

比如,输入[1,2,3,4,5,6],k=2,那么输出就是[5,6,1,2,3,4]。可以很清楚地看到数组有两个部分,分别是下标[0,n-k-1]和[n-k,n-1](n为数组长度),即以n-k-1为划分界线。

公认的套路是使用翻转,我写的代码如下:

   public void rotate(int[] nums, int k) {
        int n = nums.length;
        reverse(0, n - k - 1, nums);
        reverse(n - k, n - 1, nums);
        reverse(0, n - 1, nums);
    }

    public void reverse(int start, int end, int[] array) {
        int i = start;
        int j = end;
        while(i<=j ){
            int t = array[i];
            array[i] = array[j];
            array[j] = t;
            i++;
            j--;
        }
    }

一个算法理论上要能处理所有情形,才是一个合格的算法。以上的代码是无法通过Leetcode的测试的,因为完全没有考虑违规值。比如输入nums为空,或者k>n的情况。因此,需要加上以下代码:

 if (nums==null || n <= 0 || k <= 0)
            return;
 // k maybe larger than n
 k = k % n;

此外,reverse方法也是一个很通用的方法。使用两个指针,一个在头,一个在尾,进行交换。

 public void reverse(int start, int end, int[] array) {
        int i = start;
        int j = end;
        while(i<=j ){
            int t = array[i];
            array[i] = array[j];
            array[j] = t;
            i++;
            j--;
        }

另,我觉得rotate方法里三次调用reverse方法的写法,非常美丽。是代码本身的美丽。

  public void rotate(int[] nums, int k) {
        int n = nums.length;
        reverse(0, n - k - 1, nums);
        reverse(n - k, n - 1, nums);
        reverse(0, n - 1, nums);
    }

相关文章

  • 数组 / Q189: 旋转数组

    给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 比如,输入[1,2,3,4,5,6],k=...

  • [剑指offer]08-旋转数组的最小数字

    旋转数组的最小数字 题目 给定一个递增的旋转数组A,返回旋转数组中的最小值。旋转数组:给定一个已排序的数组,假设为...

  • Day6 剑指offer:旋转数字的最小数

    把一个数组最开始的若干个数组搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组...

  • 剑指Offer算法题-旋转数组的最小数字--Swift

    题目:把一个数组最开始的若干个元素搬到数组的尾部,我们称之为数组的旋转。输入一个递增数组的旋转,输出旋转数组的最小...

  • 旋转数组的最小值

    旋转数组的最小值 所谓旋转数组,即是递增有序数组旋转右移动若干位得到的数组,这里的右移和java里的>>>有点不同...

  • [查找和排序]旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组...

  • 旋转数组的最小数字

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组...

  • 面试题11: 旋转数组的最小数字

    题意:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组...

  • 面试题11-旋转数组求最小数

    题目要求 旋转数组是指将数组的元素逐个移动至数组尾部。现在有一个递增的数组,将数组旋转后,求数组的最小值。 题目解...

  • 39. 恢复旋转排序数组

    给定一个旋转排序数组,在原地恢复其排序。说明:什么是旋转数组?比如,原始数组为[1,2,3,4], 则其旋转数组可...

网友评论

    本文标题:数组 / Q189: 旋转数组

    本文链接:https://www.haomeiwen.com/subject/nbgzcctx.html