C 语言 数组交换最小值和最大值

devtools/2024/11/14 9:24:22/

题目

本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。注意:题目保证最大和最小值都是唯一的。

方法一

#include <stdio.h>
int main()
{int n, min, max, cop=0;int arr[10] = { 0 };scanf("%d", &n);//数组赋值for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}//假设最小值和最大值数组的首元素min = arr[0];max = arr[0];//找出最小值for (int i = 0; i < n; i++){if (arr[i] < min){min = arr[i];cop = i;}}//交换最小值与数组首元素//创建临时变量 tmpint tmp = arr[0];arr[0] = min;arr[cop] = tmp;//找出最大值for (int i = 0; i < n; i++){if (arr[i] > max){max = arr[i];cop = i;}}//交换最大值与数组最后一个元素tmp = arr[n - 1];arr[n - 1] = max;arr[cop] = tmp;//打印输出for (int i = 0; i < n; i++){printf("%d ", arr[i]);}return 0;
}

方法一思路,从上找到数组的最小值和最大值入手,找到一个数组的最小值和最大值,首先假设数组的首元素是最大值和最小值,接着遍历数组,依次判断是否为最大值和最小值,如果是更新min或max。接下来交换最大值和最小值就简单了,我们目前已经得到了min和max,现在只需要记录下他们各自的索引值,然后再交换就可以了

如下,找出最大值和最小值的具体代码

#include <stdio.h>
int main()
{int arr[10] = { 0 };int n,min,max;scanf("%d", &n);for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}min = arr[0];max = arr[0];for (int i = 0; i < n; i++){//找出最大值if (arr[i] < min){min = arr[i];}//找出最小值if (arr[i] > max){max = arr[i];}}printf("%d %d", min, max);return 0;
}

方法二

int main()
{int arr[10] = {0};int n,min,max,cop1=0,cop2=0;scanf("%d", &n);for (int i = 0; i < n; i++){scanf("%d", &arr[i]);}min = arr[0];max = arr[0];//遍历数组for (int i = 1; i < n; i++){if (arr[i] > max){max = arr[i];cop1 = i;  //最大索引值}if (arr[i] < min){min = arr[i];cop2 = i;   //最小索引值}}//8 2 5 1 4if (max == arr[0]) //第一位就是最大值{int tmp2 = arr[n - 1];arr[n - 1] = arr[cop1];arr[cop1] = tmp2;//4 2 5 1 8if (n > 2){int tmp1 = arr[0];arr[0] = arr[cop2];arr[cop2] = tmp1;}}//2 8 5 4 1else if (min == arr[n - 1]) //最后一位就是最小值{int tmp1 = arr[0];arr[0] = arr[cop2];arr[cop2] = tmp1;//1 8 5 4 2if (n > 2){int tmp2 = arr[n - 1];arr[n - 1] = arr[cop1];arr[cop1] = tmp2;}}//8 2 5 4 1else if(min==max){int tmp = arr[cop1];arr[cop1] = arr[cop2];arr[cop2] = tmp;}//2 8 1 5 4else{int tmp2 = arr[n - 1];arr[n - 1] = arr[cop1];arr[cop1] = tmp2;int tmp1 = arr[0];arr[0] = arr[cop2];arr[cop2] = tmp1;}//打印for (int i = 0; i < n; i++){printf("%d ", arr[i]);}return 0;
}

方法二我简单说一下,没有使用额外的min和max的值,而是直接利用两个索引值进行交换,但这需要考虑最大值和最小值的位置情况,如最大值在首元素时,如果先交换最小值再交换最大值,那在交换最小值后,数组元素改变,再使用索引值交换最大值时会出错,因为数组元素已经改变,需要更新索引值,这就不得不分情况考虑,无形之中就增加了代码量,所以并不建议,这里不再多做介绍,就算你有比较好的处理方式,也不建议,因为方法一的思路明显更简便。

推荐第一种方法,思路简单不复杂,巧妙的化解了使用数组中的两个元素交换时要考虑的最大值和最小值的位置情况,创建两个变量,接受数组的最大值和最小值,在交换时就不用考虑可能最大值在第一个位置或者其他而导致在交换下一个值时,数组的元素已经改变。所以,使用另外两个min和max两个额外的变量,就很好的化解要考虑多种情况。

其实这种题目主要是思路上问题,看看有没有更优解,方法一是我认为对于小白来说比较简便的思路了,至于其他的实现思路,欢迎各位指导。


http://www.ppmy.cn/devtools/133885.html

相关文章

【云原生开发】K8S多集群管理系统成果展示

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

人力资源招聘系统-提升招聘效率与质量的关键工具

在当今这个竞争激烈的商业环境中&#xff0c;企业要想在市场中立于不败之地&#xff0c;关键在于拥有高素质的人才队伍。然而&#xff0c;传统的招聘方式往往效率低下&#xff0c;难以精准匹配企业需求与人才特质&#xff0c;这无疑给企业的发展带来了不小的挑战。 随着科技的飞…

服务器同步时间脚本

1. 需要同步的服务器&#xff0c;设置root登录互信 2. 执行如下脚本 使用IP1时间同步IP2和IP3的时间 #!/bin/bash # 基准服务器的IP地址 MASTER_SERVER"IP1" # 其他服务器的IP地址列表 SLAVE_SERVERS("IP2" "IP3") # 从基准服务器获取当前…

在 WPF 中,如何使用命令来替代事件处理?

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;命令是一种非常强大的替代传统事件处理的方法&#xff0c;特别适用于 MVVM&#xff08;Model-View-ViewModel&#xff09;架构。命令可以实现界面&#xff08;View&#xff09;和逻辑&#xff08;…

音视频入门基础:MPEG2-TS专题(3)——TS Header简介

注&#xff1a;本文有部分内容引用了维基百科&#xff1a;https://zh.wikipedia.org/wiki/MPEG2-TS 一、引言 本文对MPEG2-TS格式的TS Header进行简介。 进行简介之前&#xff0c;请各位先下载MPEG2-TS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-TS的官方文档。但是ITU提供的…

【Linux】Ubuntu中muduo库的编译环境安装

Muduo is a multithreaded C network library based on the reactor pattern. muduo库的介绍就是&#xff1a;一个基于reactor反应堆模型的多线程C网络库。 muduo网络库是C语言开发的一个非常优秀的网络库&#xff0c;作者陈硕&#xff0c;muduo网络库在多线程环境下性能非常高…

【前端】技术演进发展简史

一、前端 1、概述 1990 年&#xff0c;第一个web浏览器诞生&#xff0c;Tim 以超文本语言 HTML 为基础在 NeXT 电脑上发明了最原始的 Web 浏览器。 1991 年&#xff0c;WWW诞生&#xff0c;这标志着前端技术的开始。 前端&#xff08;Front-end&#xff09;和后端&#xff08;…

Spring Boot框架:电商系统的技术优势

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本网上商城系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&…