1 初級演算法題 旋轉陣列

2021-10-05 04:18:48 字數 2635 閱讀 5777

題目:給定乙個陣列,將陣列中的元素向右移動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,...