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)的方法,会导致有的元素覆盖。
每天进步一点点吧,嗯...跟随大神的脚步......