首页 > 解决方案 > 交换数组中最后一次出现的最小值和最大值

问题描述

我目前正在尝试使用指针交换数组的最小值和最大值的位置。

(a) Single instance min & max
Input: 1 2 3 4 5
Output: 5 2 3 4 1

(b) Multiple instance min & max
Input: 9 1 1 9 9 5 5 5 5 
Output: 9 1 9 9 1 5 5 5 5

代码:

void swapMinMax(int ar[], int size)
{
int i, *max, *min;

*max = *min = ar[0];
//swap max & min
for(i=0;i<size-1;i++)
{
    if(ar[i]>*max)
        *max=ar[i];
    else if(ar[i]<*min)
        *min=ar[i];
}
}

如何为 min & max 的多个实例实现交换?

标签: c

解决方案


要获取最后一次出现的最小值和最大值,您只需将 if 语句从严格的更大/更小更改为更大/更小或等于,这样它将获取最后一个。

但是,在您这样做之前,您需要修复代码中的其他一些问题。

首先,您创建minmax作为指针,然后尝试使用它们来存储值,这将导致未定义的行为(您的程序可能无法工作)。

其次,如果size是数组的大小,那么由于某种原因,您会跳过最后一个元素。

最后,您仍然需要最后交换元素。

结合所有这些,我们得到:

void swapMinMax (int ar[], int size) {
    int i, *max, *min;
    max = min = ar;
    for (i = 0; i < size; i++) { //Iterate over the entire array
        if (ar[i] >= *max) //Larger or equal to since we want the last occurrence
            max = &ar[i]; //Assign a pointer to our pointer
        else if (ar[i] <= *min) //Smaller or equal to since we want the last occurrence
            min = &ar[i]; //Again, we assign a pointer to our pointer
        }
    }
    //And now we swap the values
    int temp = *min;
    *min = *max;
    *max = temp;
}

推荐阅读