尝试交换数组中的最大和最小数字

Posted

技术标签:

【中文标题】尝试交换数组中的最大和最小数字【英文标题】:Trying to swap the maximum and the minimum numbers in an array 【发布时间】:2021-01-08 00:28:28 【问题描述】:

我正在尝试在我的程序中交换数组中的最大值和最小值。 代码如下:

public static void main(String[] args) 
    Scanner in = new Scanner(System.in);

    int myArray[] = new int[25];

    for (int i = 0; i < myArray.length; i++) 
        System.out.println("Enter a number: ");
        myArray[i] = in.nextInt();
    
    int maximum = maxNumber(myArray);
    int minimum = minNumber(myArray);

    System.out.println(Arrays.toString(myArray));

public static int maxNumber(int[] arr) 
    int maximumValue = arr[0];
    //finds the maximum value in an array
    for (int a = 1; a < arr.length; a++) 
        if (arr[a] > maximumValue) 
            maximumValue = arr[a];
        
    
    return maximumValue;

public static int minNumber(int[] arr) 
    int minimumValue = arr[0];
    //finds the minimum value in an array
    for (int a = 1; a < arr.length; a++) 
        if (arr[a] < minimumValue) 
            minimumValue = arr[a];
        
    
    return minimumValue;

我有两个单独的函数来查找最大值和最小值,但我一直停留在值的实际交换上。这两个函数就像我在另一个程序中使用它们一样工作,但我不确定它们是否适用于这个程序。

起初我想通过以某种方式将它们设置为彼此相等来找到它们,但这没有任何结果。

任何帮助将不胜感激。

【问题讨论】:

你不应该得到最大值 value 而是最大值的 index,最小值也是一样的。然后在这些索引处切换值。 【参考方案1】:
public static void main(String... args) 
    Scanner scan = new Scanner(System.in);
    int[] arr = new int[25];

    System.out.format("Enter array int numbers (%d in total): ", arr.length);

    for (int i = 0; i < arr.length; i++)
        arr[i] = scan.nextInt();

    System.out.println(Arrays.toString(arr));
    swamMinMax(arr);
    System.out.println(Arrays.toString(arr));


private static void swamMinMax(int[] arr) 
    int min = Integer.MAX_VALUE;
    int max = Integer.MIN_VALUE;

    for (int i = 0; i < arr.length; i++) 
        min = Math.min(min, arr[i]);
        max = Math.max(max, arr[i]);
    

    for (int i = 0; i < arr.length; i++) 
        if (arr[i] == min)
            arr[i] = max;
        else if (arr[i] == max)
            arr[i] = min;
    

输出:

Enter array int numbers (25 in total): 1 2 3 4 5 6 7 8 9 10 -1 -1 -1 14 15 16  17 18 19 20 21 22 23 66 66
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, 1, 1, 1, 17, 18, 19, 20, 21, 22, 23, 66, 66]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 66, 66, 66, 1, 1, 1, 17, 18, 19, 20, 21, 22, 23, -1, -1]

【讨论】:

【参考方案2】:

你真的很亲密。我复制了一些代码并评论了需要进行更改的地方。您仍然可以使用现有代码从控制台填充数组。

此外,将数组中的第一个元素分配给 min 或 max 并将循环从 1 开始,这点赞不绝口。很多人不考虑这样做。

int myArray[] = 1,10,-5,99,48,-22,43, 44,100,2;
    
System.out.println(Arrays.toString(myArray));   // print original array
int maxIdx = maxNumber(myArray);                // get index of max
int minIdx = minNumber(myArray);                // get index of min
    
// now swap max and min using the returned indices.
int save = myArray[maxIdx];
myArray[maxIdx] = myArray[minIdx];
myArray[minIdx] = save;
System.out.println(Arrays.toString(myArray));   // print the altered array

    
public static int maxNumber(int[] arr) 
    int maximumValue = arr[0];
    // finds the maximum value in an array
    int idx = 0;                                    //idx = 0 to start
    for (int a = 1; a < arr.length; a++) 
        if (arr[a] > maximumValue) 
            idx = a;                                //save index of current max
            maximumValue = arr[a];
        
    
    return idx;                                     // return index of max

    
public static int minNumber(int[] arr) 
    int minimumValue = arr[0];
    // finds the minimum value in an array
    int idx = 0;                                    // idx = 0 to start
    for (int a = 1; a < arr.length; a++) 
        if (arr[a] < minimumValue) 
            idx = a;                                // save index of current min
            minimumValue = arr[a];
        
    
    return idx;                                     // return index of min

这会打印出来

[1, 10, -5, 99, 48, -22, 43, 44, 100, 2]
[1, 10, -5, 99, 48, 100, 43, 44, -22, 2]

【讨论】:

【参考方案3】:

您可以使用IntStream 查找最大和最小元素的索引,然后交换它们的值:

int[] arr = 1, 3, 5, 6, 4, 2, 8, 7, 9, -1, -3;
// indexes of the maximum and minimum elements
int max = IntStream.range(0, arr.length)
        .boxed().max(Comparator.comparing(i -> arr[i])).orElse(-1);

int min = IntStream.range(0, arr.length)
        .boxed().min(Comparator.comparing(i -> arr[i])).orElse(-1);
// swap the values
int temp = arr[max];
arr[max] = arr[min];
arr[min] = temp;
System.out.println(Arrays.toString(arr));
// [1, 3, 5, 6, 4, 2, 8, 7, -3, -1, 9]

【讨论】:

以上是关于尝试交换数组中的最大和最小数字的主要内容,如果未能解决你的问题,请参考以下文章

在Java中查找数组中的最小和最大数

快速排序算法的最大和最小交换量

用C#找出数组中的最大值和最小值

把数组中的数拼接起来,求最大值

[PTA]实验7-1-10 交换最小值和最大值

C语言实例第06期:交换数组中最大数和最小数的位置