源本科技 | 码上会

数组极值交换

2026/02/11
10
0

题目

输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

说明

本题要求对一个整数数组进行如下操作:

  1. 找到数组中的最大值,将其与第一个元素(索引 0)交换;

  2. 找到数组中的最小值,将其与最后一个元素(索引 n-1)交换;

  3. 输出交换后的数组。

关键难点:当最大值或最小值的位置发生重叠时(例如最小值原本就在第一个位置),交换顺序会影响结果。特别地,如果最小值恰好是原数组的第一个元素,那么在第一步中它已经被换到了最大值原来的位置。此时若仍用原始的 a[min] 去和末尾交换,就会出错。

因此,程序中通过判断 min == 0 来处理这种特殊情况:

  • 若最小值不是第一个元素,则正常将最小值与末尾交换;

  • 若最小值第一个元素(即 min == 0),则在第一步交换后,原来的最小值已移动到 max 的位置,此时应将 a[max](即原最小值)与末尾交换。

注意:该实现假设最大值和最小值各只有一个。若存在重复极值,只处理首次找到的那个(因遍历从左到右,>< 不包含等号)。

运行示例

示例 1:一般情况

输入:

定义数组的长度:
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

示例 2:最小值在首位(特殊情况)

输入:

定义数组的长度:
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 1

👈点击左箭头查看答案(一定要在自己思考并实现后再看参考答案哦!)

程序实现

import 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] + " ");
        }
    }
}

补充说明:此问题常用于考察对数组索引变化边界条件处理的理解。在实际开发中,类似逻辑可能出现在数据预处理、特征工程等场景。若需处理多个相同极值的情况,可改用 >= / <= 并记录所有极值索引,但本题按常规理解为单极值即可。