第八个算法-旋转数组

首先承认一下自己的不足,这个本来是很简单的算法,我进入死胡同,经验想了3个小时的时间才解决。脑子果然僵死了啊。多练,多学。

题目:

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

示例 1:

输入: [1,2,3,4,5,6,7]k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

示例 2:

输入: [-1,-100,3,99]k = 2
输出: [3,99,-1,-100]
解释: 
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

思路:
1,先复制一个数组做备份。
2,直接循环原始数组,把0到数组长度-k的值后延k个单位。
3,把原始数组中的倒数第k个数组赋值到从0到k的值。
代码:
public void rotate(int[] nums, int k) {

if(k>nums.length){
k = k% nums.length;
}
if(k>0&&nums.length>1){
int stag0 = 0 ;
int[] numsclone = nums.clone();
stag0 = nums[nums.length-k];
for(int j = nums.length-1;j>=k;j--){
if(j==0){
nums[0] = stag0;
continue;
}
nums[j] = nums[j-k];
}
for(int i =0;i<k;i++){
nums[i] = numsclone[numsclone.length-k+i];
}
}

}


别人的优秀代码:
public void rotate(int[] nums, int k) {
int[] num1=new int[nums.length];
k = (nums.length + (k % nums.length)) % nums.length; // 保证k为正
// k=k%nums.length; leet给的示例代码中这样处理k当k是负数是会有问题
System.arraycopy(nums,nums.length-k,num1,0,k);
System.arraycopy(nums,0,num1,k,nums.length-k);
System.arraycopy(num1,0,nums,0,nums.length);
/*
public static void arraycopy(Object src,//src - 源数组。
int srcPos, //srcPos - 源数组中的起始位置。
Object dest, //dest - 目标数组。
int destPos, //destPos - 目标数据中的起始位置。
int length) //length - 要复制的数组元素的数量。
*/
}

不怪自己笨啊,没想到用系统自带的方法处理。

posted on 2018-07-17 16:32  liutian1912  阅读(146)  评论(0)    收藏  举报

导航