第八個算法-旋轉數組

首先認可一下本身的不足,這個原本是很簡單的算法,我進入死衚衕,經驗想了3個小時的時間才解決。腦子果真僵死了啊。多練,多學。算法

題目:數組

給定一個數組,將數組中的元素向右移動 個位置,其中 是非負數。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 - 要複製的數組元素的數量。
*/
}

不怪本身笨啊,沒想到用系統自帶的方法處理。
相關文章
相關標籤/搜索