交换最小值和最大值

本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。

注意:题目保证最大和最小值都是唯一的。

输入格式:

输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。

输出格式:

在一行中顺序输出交换后的序列,每个整数后跟一个空格。

输入样例:

5
8 2 5 1 4

输出样例:

1 2 5 4 8

一开始的思路是直接从数组里找出最大最小值然后根据条件交换。

for (i = 0; i < n; i++)
 {
  if (min > a[i])
  {
   min = a[i];//找出最小值
  }
  if (max < a[i])
  {
   max = a[i];//找出最大值
  }

这个的问题是只找出了最大最小值,并没有记录下最大最小值的下标,在后续交换的过程中无从下手。

然后再针对此问题的情况下,再找出最大最小值的情况下,设置min_num和max_num记录下它们的下标并按条件交换。

for (i = 0; i < n; i++)
 {
  if (min > a[i])
  {
   min = a[i];//找出最小值
   min_num = i;
  }
  if (max < a[i])
  {
   max = i;//找出最大值
   max_num = i;
  }
 }

 //最小值与第一个交换
 temp = a[0];
 a[0] = a[min_num];
 a[min_num] = temp;

 //最大值与最后一个交换
 temp = a[n - 1];
 a[n - 1] = a[max_num];
 a[max_num] = temp;

此后又出现了问题,事因是由于先实行最小值和第一个进行了交换,所以如果第一个值原来恰好是最大值的话,所以在进行了第一次交换后第一个值就不是最大值了,此时再用原来遍历时找到的最大值记录的下标进行交换答案是错误的。

针对这个问题采用了在进行第一次交换后重新遍历找到最大值的位置,然后再进行交换。

#include<stdio.h>
#include<stdlib.h>

int main()
{
	int n, i, min, max, temp;
	int min_num = 0, max_num = 0;
	int *a;
	scanf_s("%d", &n);

	a = (int*)calloc(n, sizeof(int));//动态分配内存

	for (i = 0; i < n; i++)//输入数组
	{
		scanf_s("%d", &a[i]);
	}

	min = a[0];

	for (i = 0; i < n; i++)
	{
		if (min > a[i])
		{
			min = a[i];//找出最小值
			min_num = i;
		}
		
	}


	//最小值与第一个交换
	temp = a[0];
	a[0] = a[min_num];
	a[min_num] = temp;

	max = a[0];

	for (i = 0; i < n; i++)
	{
		if (max < a[i])
		{
			max = a[i];//找出最大值
			max_num = i;
		}
	}

	//最大值与最后一个交换
	temp = a[n - 1];
	a[n - 1] = a[max_num];
	a[max_num] = temp;

	 for (i = 0; i < n; i++)
	 {
	  printf("%d ", a[i]);
	 }

	return 0;
}
### 关于C语言实现交换最小值最大值的PTA题解 对于给出的任务,在C语言中实现寻找并交换数组中的最小值最大值可以通过定义函数来完成。此过程涉及遍历整个数组以找到这两个特定位置,然后执行它们之间的值互换操作。 下面是一个具体的例子,展示了如何在C语言环境中解决这个问题: ```c #include <stdio.h> void swap(int *xp, int *yp) { int temp = *xp; *xp = *yp; *yp = temp; } int main() { int n; printf("请输入整数的数量: "); scanf("%d", &n); int arr[n]; printf("输入%d个整数值:\n", n); for (int i = 0; i < n; ++i){ scanf("%d", &arr[i]); } // 初始化索引 int min_idx = 0, max_idx = 0; // 寻找最小值最大值的位置 for (int j = 1; j < n; ++j) { if (arr[j] < arr[min_idx]) { min_idx = j; } if (arr[j] > arr[max_idx]) { max_idx = j; } } // 如果最小值位于第一位,则最后一个元素交换再做处理 if(min_idx == 0 && max_idx != 0){ swap(&arr[min_idx], &arr[n-1]); swap(&arr[max_idx], &arr[0]); }else{ swap(&arr[min_idx], &arr[max_idx]); } // 输出修改后的数组 printf("交换后的数组为:\n"); for (int k = 0; k < n; ++k){ printf("%d ", arr[k]); } } ``` 上述代码实现了读取一组整数到数组`arr[]`中,并找到了其中的最大值最小值所在的位置。之后利用辅助函数`swap()`完成了两者之间值得互换工作。注意这里考虑到了当最小值正好处于数组首部的情况特殊处理[^1]。 #### 处理特殊情况说明 如果最小值恰好是在数组的第一个位置上,那么为了确保最终结果正确无误,应该采取额外措施防止直接覆盖掉原本打算放置最大值的地方。因此在这种情况下,会最小值跟最后一个元素调换位置后再继续下一步骤的操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值