189. Rotate Array

xiaoxiao2021-02-28  97

Rotate an array of n elements to the right by k steps.

For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

这是一道求数组旋转的问题,题目求的是一个一维数组向右旋转k个位置的结果,即第0位元素移到第k位,第1位元素移到第k+1位,这里另外用了一个新的数组a,代码如下:

int[] a = new int[nums.length]; for (int i = 0; i < nums.length; i++) { a[(i + k) % nums.length] = nums[i]; } for (int i = 0; i < nums.length; i++) { nums[i] = a[i]; }

另外,数组的旋转可以看作是从数组的末尾取k个元素放在数组开头,这种解法暂时还没想到怎么写代码,明天再写==吧

=========================================分割线=======================================================

自己后来写了下面这种最笨的方法,结果应该是对的,但是空间复杂度太大,导致没有通过。

int len = nums.length; List<Integer> list1 = new ArrayList<Integer>(); List<Integer> list2 = new ArrayList<Integer>(); for(int i=k+1;i<len;i++){ list1.add(nums[i]); } for(int j=0;j<k+1;j++){ list2.add(nums[j]); } list1.addAll(list2); //System.out.println(list1); list1.toArray(); for(int t=0;t<len;t++){ nums[t]=list1.get(t); }于是,参考了大神的写法:

int len = nums.length; int k1=k%len; int [] nums1 = new int [k1]; for(int i=0;i<k1;i++){ nums1[i]=nums[len-k1+i]; } for(int j=len-k1-1;j>=0;j--){ nums[j+k1]=nums[j]; } for(int i=0;i<k1;i++){ nums[i]=nums1[i]; } 这种算法的思想是新建一个数组nums1,保存要放在开头的k1个元素,然后取出nums中的前len-k1个元素,这时候要先取下标为len-k1-1的元素放在末尾,再取下标为len-k1-2的元素...以为如果取得时候下标按照0-(len-k1-1)的方法,会导致有的元素覆盖。

每天进步一点点吧,嗯...跟随大神的脚步......

转载请注明原文地址: https://www.6miu.com/read-62620.html

最新回复(0)