使用Java解決數(shù)組旋轉(zhuǎn)問(wèn)題的方法詳解
問(wèn)題描述
給定一個(gè)包含n個(gè)整數(shù)的數(shù)組,要求將數(shù)組中的元素向前移動(dòng)m個(gè)位置,即數(shù)組的前n-m個(gè)元素順序向后移動(dòng)m個(gè)位置,最后m個(gè)元素移動(dòng)到數(shù)組的最前面。例如,給定數(shù)組??[1, 2, 3, 4, 5]??和m=2,則數(shù)組變?yōu)??[4, 5, 1, 2, 3]??。

解決方案
方法一:使用額外數(shù)組
最直觀的方法是使用一個(gè)額外的數(shù)組來(lái)存儲(chǔ)旋轉(zhuǎn)后的結(jié)果,然后將結(jié)果復(fù)制回原數(shù)組。這種方法簡(jiǎn)單易懂,但需要額外的空間。
Java代碼實(shí)現(xiàn)
public class ArrayRotate {
public static void rotate(int[] nums, int m) {
if (nums == null || nums.length == 0) return;
int n = nums.length;
m %= n; // 處理m大于n的情況
if (m == 0) return;
int[] temp = new int[m];
System.arraycopy(nums, n - m, temp, 0, m); // 復(fù)制最后m個(gè)元素到臨時(shí)數(shù)組
System.arraycopy(nums, 0, nums, m, n - m); // 將前n-m個(gè)元素向后移動(dòng)m個(gè)位置
System.arraycopy(temp, 0, nums, 0, m); // 將臨時(shí)數(shù)組的內(nèi)容復(fù)制到數(shù)組的最前面
}
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
int m = 2;
rotate(nums, m);
for (int num : nums) {
System.out.print(num + " ");
}
}
}方法二:反轉(zhuǎn)數(shù)組
更高效的方法是通過(guò)反轉(zhuǎn)數(shù)組來(lái)實(shí)現(xiàn)旋轉(zhuǎn)。具體步驟如下:
- 反轉(zhuǎn)整個(gè)數(shù)組。
- 反轉(zhuǎn)前m個(gè)元素。
- 反轉(zhuǎn)剩余的n-m個(gè)元素。
這種方法不需要額外的空間,并且時(shí)間復(fù)雜度為O(n)。
Java代碼實(shí)現(xiàn)
public class ArrayRotate {
public static void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
public static void rotate(int[] nums, int m) {
if (nums == null || nums.length == 0) return;
int n = nums.length;
m %= n; // 處理m大于n的情況
if (m == 0) return;
reverse(nums, 0, n - 1); // 反轉(zhuǎn)整個(gè)數(shù)組
reverse(nums, 0, m - 1); // 反轉(zhuǎn)前m個(gè)元素
reverse(nums, m, n - 1); // 反轉(zhuǎn)剩余的n-m個(gè)元素
}
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
int m = 2;
rotate(nums, m);
for (int num : nums) {
System.out.print(num + " ");
}
}
}
這個(gè)問(wèn)題可以通過(guò)多種方式解決,這里我將提供一個(gè)使用Java實(shí)現(xiàn)的示例代碼。這個(gè)例子中,我們將使用數(shù)組來(lái)存儲(chǔ)這些整數(shù),并通過(guò)循環(huán)和臨時(shí)數(shù)組來(lái)實(shí)現(xiàn)數(shù)組元素的旋轉(zhuǎn)。
問(wèn)題描述
給定一個(gè)包含 ??n?? 個(gè)整數(shù)的數(shù)組 ??arr?? 和一個(gè)整數(shù) ??m??,我們需要將數(shù)組中的前 ??n-m?? 個(gè)元素向后移動(dòng) ??m?? 個(gè)位置,最后 ??m?? 個(gè)元素移動(dòng)到數(shù)組的最前面。
示例
假設(shè)我們有一個(gè)數(shù)組 ??arr = [1, 2, 3, 4, 5]?? 和 ??m = 2??,那么經(jīng)過(guò)操作后,數(shù)組應(yīng)該變?yōu)???[4, 5, 1, 2, 3]??。
Java 實(shí)現(xiàn)
public class ArrayRotation {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int m = 2;
// 調(diào)用旋轉(zhuǎn)方法
rotateArray(arr, m);
// 打印旋轉(zhuǎn)后的數(shù)組
System.out.println("Rotated array:");
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void rotateArray(int[] arr, int m) {
int n = arr.length;
if (n == 0 || m % n == 0) {
return; // 如果數(shù)組為空或m是n的倍數(shù),不需要旋轉(zhuǎn)
}
m = m % n; // 處理m大于n的情況
// 使用臨時(shí)數(shù)組來(lái)存儲(chǔ)最后m個(gè)元素
int[] temp = new int[m];
for (int i = 0; i < m; i++) {
temp[i] = arr[n - m + i];
}
// 將前n-m個(gè)元素向后移動(dòng)m個(gè)位置
for (int i = n - m - 1; i >= 0; i--) {
arr[i + m] = arr[i];
}
// 將臨時(shí)數(shù)組中的元素放到數(shù)組的最前面
for (int i = 0; i < m; i++) {
arr[i] = temp[i];
}
}
}代碼解釋
- 主方法 (
main):
- 定義一個(gè)數(shù)組 ?
?arr?? 和一個(gè)整數(shù) ??m??。 - 調(diào)用 ?
?rotateArray?? 方法進(jìn)行數(shù)組旋轉(zhuǎn)。 - 打印旋轉(zhuǎn)后的數(shù)組。
- 旋轉(zhuǎn)方法 (
rotateArray):
- 獲取數(shù)組的長(zhǎng)度 ?
?n??。 - 檢查特殊情況:如果數(shù)組為空或 ?
?m?? 是 ??n?? 的倍數(shù),則直接返回。 - 計(jì)算 ?
?m % n?? 以處理 ??m?? 大于 ??n?? 的情況。 - 使用一個(gè)臨時(shí)數(shù)組 ?
?temp?? 來(lái)存儲(chǔ)數(shù)組的最后 ??m?? 個(gè)元素。 - 將數(shù)組的前 ?
?n-m?? 個(gè)元素向后移動(dòng) ??m?? 個(gè)位置。 - 將臨時(shí)數(shù)組 ?
?temp?? 中的元素放到數(shù)組的最前面。
運(yùn)行結(jié)果
對(duì)于輸入數(shù)組 ??[1, 2, 3, 4, 5]?? 和 ??m = 2??,輸出將是:
Rotated array: 4 5 1 2 3

這個(gè)問(wèn)題可以通過(guò)多種方法來(lái)解決,但這里我將介紹一種比較直觀且效率較高的方法:通過(guò)三次反轉(zhuǎn)數(shù)組來(lái)實(shí)現(xiàn)。
問(wèn)題描述
給定一個(gè)整數(shù)數(shù)組 ??nums?? 和一個(gè)非負(fù)整數(shù) ??m??,要求將數(shù)組的前 ??n-m?? 個(gè)元素向后移動(dòng) ??m?? 個(gè)位置,最后 ??m?? 個(gè)元素移到數(shù)組的最前面。
解決方案
- 反轉(zhuǎn)整個(gè)數(shù)組:首先將整個(gè)數(shù)組反轉(zhuǎn)。
- 反轉(zhuǎn)前 ?
?m??? 個(gè)元素:然后將前 ??m?? 個(gè)元素反轉(zhuǎn)。 - 反轉(zhuǎn)剩余的 ?
?n-m??? 個(gè)元素:最后將剩余的 ??n-m?? 個(gè)元素反轉(zhuǎn)。
具體步驟
假設(shè)我們有一個(gè)數(shù)組 ??nums = [1, 2, 3, 4, 5]?? 和 ??m = 2??,目標(biāo)是將數(shù)組變?yōu)???[4, 5, 1, 2, 3]??。
- 反轉(zhuǎn)整個(gè)數(shù)組:
- 原數(shù)組:?
?[1, 2, 3, 4, 5]?? - 反轉(zhuǎn)后:?
?[5, 4, 3, 2, 1]??
- 反轉(zhuǎn)前
m? 個(gè)元素:
- 前 ?
?m?? 個(gè)元素:??[5, 4]?? - 反轉(zhuǎn)后:?
?[4, 5]?? - 當(dāng)前數(shù)組:?
?[4, 5, 3, 2, 1]??
- 反轉(zhuǎn)剩余的
n-m? 個(gè)元素:
- 剩余的 ?
?n-m?? 個(gè)元素:??[3, 2, 1]?? - 反轉(zhuǎn)后:?
?[1, 2, 3]?? - 最終數(shù)組:?
?[4, 5, 1, 2, 3]?

Java 實(shí)現(xiàn)代碼
public class ArrayRotation {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5};
int m = 2;
rotate(nums, m);
for (int num : nums) {
System.out.print(num + " ");
}
}
public static void rotate(int[] nums, int m) {
if (nums == null || nums.length == 0 || m < 0) {
throw new IllegalArgumentException("Invalid input");
}
int n = nums.length;
m = m % n; // 處理 m 大于數(shù)組長(zhǎng)度的情況
reverse(nums, 0, n - 1); // 反轉(zhuǎn)整個(gè)數(shù)組
reverse(nums, 0, m - 1); // 反轉(zhuǎn)前 m 個(gè)元素
reverse(nums, m, n - 1); // 反轉(zhuǎn)剩余的 n-m 個(gè)元素
}
private static void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}代碼解釋
- 主函數(shù)
main?:
- 初始化數(shù)組 ?
?nums?? 和旋轉(zhuǎn)次數(shù) ??m??。 - 調(diào)用 ?
?rotate?? 方法進(jìn)行數(shù)組旋轉(zhuǎn)。 - 打印旋轉(zhuǎn)后的數(shù)組。
- 旋轉(zhuǎn)方法
rotate?:
- 檢查輸入的有效性。
- 計(jì)算實(shí)際需要旋轉(zhuǎn)的步數(shù) ?
?m??(處理 ??m?? 大于數(shù)組長(zhǎng)度的情況)。 - 調(diào)用 ?
?reverse?? 方法三次,分別反轉(zhuǎn)整個(gè)數(shù)組、前 ??m?? 個(gè)元素和剩余的 ??n-m?? 個(gè)元素。
- 反轉(zhuǎn)方法
reverse?:
- 使用雙指針?lè)ń粨Q數(shù)組中的元素,從兩端向中間逐步交換。
這種方法的時(shí)間復(fù)雜度為 O(n),空間復(fù)雜度為 O(1),非常高效。希望這個(gè)解釋對(duì)你有幫助!如果有任何問(wèn)題或需要進(jìn)一步的說(shuō)明,請(qǐng)隨時(shí)告訴我。
以上就是使用Java解決數(shù)組旋轉(zhuǎn)問(wèn)題的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Java解決數(shù)組旋轉(zhuǎn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java根據(jù)分組key構(gòu)建合并數(shù)據(jù)集的代碼詳解
這篇文章主要介紹了Java中如何對(duì)List數(shù)據(jù)進(jìn)行雙層分組合并,通過(guò)sub_product_name和approval_result作為分組鍵,使用rowspan實(shí)現(xiàn)跨行合并,最終生成前端可展示的結(jié)構(gòu)化數(shù)據(jù)集,需要的朋友可以參考下2025-06-06
SpringBoot整體讀取多個(gè)配置屬性及其相關(guān)操作方法
本文介紹SpringBoot中@ConfigurationProperties用于批量讀取配置屬性,對(duì)比@Value,涵蓋其用法、配置選項(xiàng)、List處理及校驗(yàn)功能,支持寬松綁定與屬性轉(zhuǎn)換,需相關(guān)依賴(lài)啟用,感興趣的朋友一起看看吧2025-07-07
解決Java?結(jié)構(gòu)化數(shù)據(jù)處理開(kāi)源庫(kù)?SPL的問(wèn)題
這篇文章主要介紹了Java?結(jié)構(gòu)化數(shù)據(jù)處理開(kāi)源庫(kù)?SPL的問(wèn)題,Scala提供了較豐富的結(jié)構(gòu)化數(shù)據(jù)計(jì)算函數(shù),但編譯型語(yǔ)言的特點(diǎn),也使它不能成為理想的結(jié)構(gòu)化數(shù)據(jù)計(jì)算類(lèi)庫(kù),對(duì)此內(nèi)容感興趣的朋友一起看看吧2022-03-03
Java的分支結(jié)構(gòu)與循環(huán)你知道多少
這篇文章主要為大家詳細(xì)介紹了Java的分支結(jié)構(gòu)與循環(huán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
Springboot之@ConfigurationProperties注解解讀
在Spring Boot中,@EnableConfigurationProperties注解的主要作用是激活@ConfigurationProperties注解的配置屬性類(lèi),從而讓配置屬性類(lèi)能被Spring容器管理,這樣的話(huà),我們就可以在屬性類(lèi)中輕松地使用@ConfigurationProperties來(lái)綁定配置文件中的屬性2024-10-10
springboot創(chuàng)建監(jiān)聽(tīng)和處理事件的操作方法
這篇文章主要介紹了springboot創(chuàng)建監(jiān)聽(tīng)和處理事件的操作方法,使用Spring Boot的事件機(jī)制來(lái)監(jiān)聽(tīng)和處理事件有多種優(yōu)勢(shì),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-07-07
在本地用idea連接虛擬機(jī)上的hbase集群的實(shí)現(xiàn)代碼
這篇文章主要介紹了在本地用idea連接虛擬機(jī)上的hbase集群的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10

