输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
本题要求对一个整数数组进行如下操作:
找到数组中的最大值,将其与第一个元素(索引 0)交换;
找到数组中的最小值,将其与最后一个元素(索引 n-1)交换;
输出交换后的数组。
关键难点:当最大值或最小值的位置发生重叠时(例如最小值原本就在第一个位置),交换顺序会影响结果。特别地,如果最小值恰好是原数组的第一个元素,那么在第一步中它已经被换到了最大值原来的位置。此时若仍用原始的 a[min] 去和末尾交换,就会出错。
因此,程序中通过判断 min == 0 来处理这种特殊情况:
若最小值不是第一个元素,则正常将最小值与末尾交换;
若最小值是第一个元素(即 min == 0),则在第一步交换后,原来的最小值已移动到 max 的位置,此时应将 a[max](即原最小值)与末尾交换。
注意:该实现假设最大值和最小值各只有一个。若存在重复极值,只处理首次找到的那个(因遍历从左到右,
>和<不包含等号)。
输入:
定义数组的长度:
5
输入第1个数据:3
输入第2个数据:7
输入第3个数据:1
输入第4个数据:9
输入第5个数据:4执行过程:
最大值 9 在索引 3,与 a[0]=3 交换 → [9,7,1,3,4]
最小值 1 在索引 2 ≠ 0,与 a[4]=4 交换 → [9,7,4,3,1]
输出:
9 7 4 3 1输入:
定义数组的长度:
3
输入第1个数据:1
输入第2个数据:5
输入第3个数据:3执行过程:
最大值 5 在索引 1,与 a[0]=1 交换 → [5,1,3]
此时原最小值 1 已移到索引 1(即原 max 位置),且 min==0 成立
执行 else 分支:将 a[max]=a[1]=1 与 a[2]=3 交换 → [5,3,1]
输出:
5 3 1import java.util.*;
public class Demo {
public static void main(String[] args) {
int i, min = 0, max = 0, n, temp1, temp2;
int a[];
System.out.println("定义数组的长度:");
Scanner in = new Scanner(System.in);
n = in.nextInt();
a = new int[n];
// 输入数组
for (i = 0; i < n; i++) {
System.out.print("输入第" + (i + 1) + "个数据:");
a[i] = in.nextInt();
}
// 查找最大值和最小值的索引
for (i = 1; i < n; i++) {
if (a[i] > a[max])
max = i;
if (a[i] < a[min])
min = i;
}
// 最大值与第一个元素交换
temp1 = a[0];
a[0] = a[max];
a[max] = temp1;
// 最小值与最后一个元素交换(处理 min==0 的特殊情况)
temp2 = a[min];
if (min != 0) {
// 最小值不在首位,直接交换
a[min] = a[n - 1];
a[n - 1] = temp2;
} else {
// 最小值原在首位,第一步交换后它已移到 max 位置
a[max] = a[n - 1];
a[n - 1] = temp1; // temp1 是原 a[0](即最小值)
}
// 输出结果
for (i = 0; i < n; i++) {
System.out.print(a[i] + " ");
}
}
}补充说明:此问题常用于考察对数组索引变化和边界条件处理的理解。在实际开发中,类似逻辑可能出现在数据预处理、特征工程等场景。若需处理多个相同极值的情况,可改用
>=/<=并记录所有极值索引,但本题按常规理解为单极值即可。