本練習要求實現一個數組的循環右移操作:給定一個包含 n 個整數的數組,將其前面的元素順序向後移動 m 個位置,最後的 m 個元素移至數組最前面。
import java.util.Scanner;
public class Tenth {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("您將輸入的數字個數為:");
int n = input.nextInt();
int[] array = new int[n];
System.out.println("您要交換的數字個數為:");
int m = input.nextInt();
System.out.println("請輸入數組:");
for (int i = 0; i < n; i++) {
array[i] = input.nextInt();
}
System.out.println("交換之前數組為:");
for (int val : array) {
System.out.print(val + " ");
}
// 核心邏輯:將前 m 個元素與後 m 個元素交換
for (int i = 0; i < m; i++) {
int temp = array[i];
array[i] = array[array.length - m + i];
array[array.length - m + i] = temp;
}
System.out.println("\n交換之後數組為:");
for (int val : array) {
System.out.print(val + " ");
}
}
}
此實現採用「首尾交換」策略:
n 和移動位數 m。m 個元素(索引 0 到 m-1)。m 個元素」中的對應位置元素交換(索引 n-m+i)。注意:此方法僅在 m <= n/2 時正確實現「循環右移」。若 m > n/2,交換邏輯會導致數據錯誤。更通用的循環右移算法通常採用「三步反轉法」或模運算索引映射。
// 通用循環右移(三步反轉法)
public static void rotateRight(int[] arr, int m) {
m = m % arr.length;
if (m < 0) m += arr.length;
reverse(arr, 0, arr.length - 1);
reverse(arr, 0, m - 1);
reverse(arr, m, arr.length - 1);
}
private static void reverse(int[] arr, int start, int end) {
while (start < end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
該方法時間複雜度 O(n),空間複雜度 O(1),適用於任意 m 值。