首先认可一下本身的不足,这个原本是很简单的算法,我进入死胡同,经验想了3个小时的时间才解决。脑子果真僵死了啊。多练,多学。算法
题目:数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。spa
示例 1:code
输入: 和 k = 3 输出: 解释: 向右旋转 1 步: 向右旋转 2 步: 向右旋转 3 步: [1,2,3,4,5,6,7][5,6,7,1,2,3,4][7,1,2,3,4,5,6][6,7,1,2,3,4,5][5,6,7,1,2,3,4]
示例 2:循环
输入: 和 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的值。
代码:
[-1,-100,3,99]
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 - 要复制的数组元素的数量。
*/
}
不怪本身笨啊,没想到用系统自带的方法处理。