題目:給定乙個陣列,將陣列中的元素向右移動n個位置,其中n是非負數。
輸入:[1, 2, 3, 4, 5, 6, 7]和n=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]
假設,給定陣列[8, 7, 6, 5, 4, 3, 2, 1],n為3,則我們可以通過n將該陣列分成以下兩部分:
劃分的規則如下:
而劃分的位置則是:陣列長度 - n。
因此,可以得到下面三種解法。
1、使用新陣列存放變換後的left、right
在不考慮空間占用的情況下,則很容易解決問題,只需乙個與給定陣列等長的陣列,將left、right部分的元素經過右移n次的轉換,放到新陣列即可,如下圖:
**如下:
public static int doscroll(int datas, int step)
// 將left部分移動到新陣列
int left = length - right;
for (int i = 0; i < left; i++)
// 將right部分移動到新陣列
for (int i = 0; i < right; i++)
return result;
}測試**:
public static void main(string args) ;
int update = doscroll(original, 3);
system.out.println(arrays.tostring(update));
}結果如下:
[3, 2, 1, 8, 7, 6, 5, 4]
2、將left的元素交換到right的右側
這樣,就涉及到元素的交換。我的想法如下:
①、還是像最上面那樣,將陣列分成left、right兩部分,如下圖:
②、從left最右側取出乙個元素,放在right最左側,如下圖:
③、讓該元素在right中右移n個位置,即不斷地和其右側元素交換位置,n次,如下圖:
重複上述②、③動作,直至left中沒有元素,即陣列索引為0,則陣列旋轉完成。
**如下:
public static void doscroll(int datas, int step)
// left與right的分界點,right包含point點
int point = length - n;
// 從left取其右端的元素
for (int left = point - 1; left >= 0; left--) }}
測試**:
public static void main(string args) ;
doscroll(original, 3);
system.out.println(arrays.tostring(original));
}結果如下:
[3, 2, 1, 8, 7, 6, 5, 4]
3、先整體反轉,再部分反轉
該方法的思想如下:
①、將陣列的元素整體反轉,如下圖:
②、在①的結果中將前n項的元素反轉,如下圖:
③、在②的結果中將後(陣列長度 - n)項的元素反轉,如下圖:
**如下:
public static void doscroll(int datas, int step)
public static void reverse(int datas, int start, int end)
}測試**:
public static void main(string args) ;
doscroll(datas, 3);
system.out.println(arrays.tostring(datas));
}結果如下:
[3, 2, 1, 8, 7, 6, 5, 4]
演算法題 旋轉陣列
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排序的陣列的乙個旋轉 遞增或遞減的 輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排序的陣列的乙個旋轉 遞增或遞減的 輸出旋轉...
LeetCode初級演算法 陣列 旋轉陣列
以下是本人的c 演算法學習筆記,記錄在部落格上以供自己隨時查閱 題目描述 給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數 盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。要求使用空間複雜度為 o 1 的原地演算法。我先在vs2017上整體實現該功能,再將關鍵 在...
LeetCode初級演算法 陣列 3 旋轉陣列
給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 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,...