c - 交换数组中最后一次出现的最小值和最大值
问题描述
我目前正在尝试使用指针交换数组的最小值和最大值的位置。
(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 的多个实例实现交换?
解决方案
要获取最后一次出现的最小值和最大值,您只需将 if 语句从严格的更大/更小更改为更大/更小或等于,这样它将获取最后一个。
但是,在您这样做之前,您需要修复代码中的其他一些问题。
首先,您创建min
和max
作为指针,然后尝试使用它们来存储值,这将导致未定义的行为(您的程序可能无法工作)。
其次,如果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;
}
推荐阅读
- linux - 如何检查文件是否来自 tmpfs 内存缓存或磁盘缓存
- r - ak fold cross validation 与开发集中的 AUC/Sensitivity/Specificity 值有何不同?
- google-cloud-platform - Deploying a Cloud Function from Cloud Build with --allow-unauthenticated
- python - 在两个不同的数据框python中获取匹配的行
- mongodb - 使用 localhost 上的副本集启动 mongodb 非分片集群
- java - 如果存在 Optional<> 值,则抛出异常
- angular - 得到错误 OK 作为来自 http 帖子的响应
- python - 无法使用 Flask 连接到 SocketIO
- python-3.x - 在while循环中的第二个提示上无效输入后重新提示
- c# - 错误:CS0120 非静态字段或方法或属性“Calculator.opsObj”需要对象引用