需求:輸入陣列,將最大值與第一個元素交換,最小值與最後一個元素交換,最後輸出陣列。
import java.util.*;
public class SwapMinMax {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("輸入陣列長度:");
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
System.out.print("輸入第 " + (i+1) + " 個數:");
a[i] = sc.nextInt();
}
int maxIdx = 0, minIdx = 0;
for (int i = 1; i < n; i++) {
if (a[i] > a[maxIdx]) maxIdx = i;
if (a[i] < a[minIdx]) minIdx = i;
}
// 交換最大值與首位
swap(a, 0, maxIdx);
// 交換最小值與末位
// 注意:若原最小值就在索引 0,經過第一次交換後已移動到 maxIdx
if (minIdx == 0) {
minIdx = maxIdx; // 更新最小值當前位置
}
swap(a, n-1, minIdx);
System.out.println("交換後陣列:" + Arrays.toString(a));
}
static void swap(int[] arr, int i, int j) {
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
}
若最小值原本在索引 0,第一次交換(最大值與索引 0)會將最小值移動到 maxIdx。因此第二次交換前必須更新 minIdx = maxIdx,否則會錯誤交換。
輸入:5 3 1 4 2 5 最大值 5 在索引 4,最小值 1 在索引 1 交換後:1 3 4 2 5 -> 5 3 4 2 1 輸出:[5, 3, 4, 2, 1]
int maxIdx = IntStream.range(0, n).boxed().max(Comparator.comparing(i -> a[i])).get();
int minIdx = IntStream.range(0, n).boxed().min(Comparator.comparing(i -> a[i])).get();
函數式寫法更簡潔,但需注意效能與舊版本相容性。