当前位置: 首页 > news >正文

7-4 交换最小值和最大值

 

分数 15

全屏浏览题目

切换布局

作者 C课程组

单位 浙江大学

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

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

输入格式:

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

输出格式:

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

输入样例:

5
8 2 5 1 4

输出样例:

1 2 5 4 8 

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

我的答案:

分析过程:

  1. 读取整数序列,并同时找到最小值及其位置,以及最大值及其位置。
  2. 将最小值与第一个整数交换。
  3. 将最大值与最后一个整数交换。
  4. 输出交换后的序列。

需要注意的是,如果最小值就是在序列的最后一个位置或者最大值就是在序列的第一个位置,交换的顺序就变得很重要了,因为先进行的交换可能会影响到后面的交换。

在我们执行交换操作时,要特别小心关于最大值和最小值的位置。如果我们先执行了一个交换,那么它可能会影响到我们后续的交换操作。

让我们以一个例子来解释:

假设我们有一个序列:8 2 5 1 4

最大值为8,位置为0(即第一个位置);最小值为1,位置为3(即第四个位置)。

按照题目要求,我们首先要将最小值与第一个数字交换,然后再将最大值与最后一个数字交换。

如果我们按照这个顺序执行,那么:

  1. 首先交换最小值1和第一个数字8,序列变为:1 2 5 8 4
  2. 接下来,我们再交换最大值8和最后一个数字4,序列变为:1 2 5 4 8

这是正确的结果。

但如果最大值是序列的第一个数字,而最小值是序列的最后一个数字,比如序列:8 2 5 4 1。按照上述交换顺序,我们会得到错误的结果,因为在我们交换最小值和第一个数字后,原来的最大值的位置已经改变,我们就不能再正确地交换最大值和最后一个数字了。

C语言:

#include <stdio.h>int main() {int N, i;int arr[10];int minIndex = 0, maxIndex = 0;// 读取数据scanf("%d", &N);for (i = 0; i < N; i++) {scanf("%d", &arr[i]);if (arr[i] < arr[minIndex]) {minIndex = i;}if (arr[i] > arr[maxIndex]) {maxIndex = i;}}// 交换最小值和第一个数int temp = arr[0];arr[0] = arr[minIndex];arr[minIndex] = temp;// 如果最大值就是第一个数,那么maxIndex需要更新if (maxIndex == 0) {maxIndex = minIndex;}// 交换最大值和最后一个数temp = arr[N-1];arr[N-1] = arr[maxIndex];arr[maxIndex] = temp;// 输出结果for (i = 0; i < N; i++) {printf("%d ", arr[i]);}return 0;
}

C++:
 

#include <iostream>
#include <vector>
using namespace std;int main() {int N;cin >> N;vector<int> arr(N);int minIndex = 0, maxIndex = 0;for (int i = 0; i < N; i++) {cin >> arr[i];if (arr[i] < arr[minIndex]) {minIndex = i;}if (arr[i] > arr[maxIndex]) {maxIndex = i;}}swap(arr[0], arr[minIndex]);// 如果最大值就是第一个数,那么maxIndex需要更新if (maxIndex == 0) {maxIndex = minIndex;}swap(arr[N-1], arr[maxIndex]);for (int i = 0; i < N; i++) {cout << arr[i] << " ";}return 0;
}

解题过程:

  1. 读取N。
  2. 创建一个数组或向量来存储整数序列。
  3. 在读取整数时,找到最小和最大值及其位置。
  4. 进行必要的交换。
  5. 输出交换后的整数序列。

总结:

从这道题目中,我们可以学到以下几点:

1. **问题分析**:在解决问题之前,需要仔细阅读和理解题目要求,以确保你考虑到了所有可能的情况。
 
2. **边界条件的重要性**:在计算机科学中,边界条件常常是出现错误的地方。这道题目强调了如果最小值或最大值位于序列的开始或结束位置,交换的顺序会产生影响。这就是一个边界条件的例子。

3. **数组操作**:这道题目强调了对数组元素的访问和修改。你需要熟悉如何在数组中找到最大值和最小值,以及如何交换数组中的两个元素。

4. **考虑交换顺序的重要性**:在执行多个交换操作时,执行顺序可能会影响最终结果,因此在编程时要特别注意。

5. **细心和注意力**:程序中的小错误(如错误地交换两个数字)可能会导致完全不同的结果。因此,编写代码时要非常细心,并在测试代码时要尽量考虑各种可能的情况。

6. **调试和测试**:在实际编程中,很可能你的第一版代码不能正确处理所有情况。这就强调了进行充分测试的重要性,特别是对于那些可能的边界条件。

综上所述,这道题目不仅测试了编程技能,还强调了计算思维、逻辑分析和问题解决的重要性。

 

http://www.lryc.cn/news/131072.html

相关文章:

  • 解决Pycharm的Settings中Project不见了也无法选择Python Interpreter的方法
  • AWS EKS 集群自动扩容 Cluster Autoscaler
  • excel中有哪些通配符、excel配置问题,数学函数篇1之sum系列
  • 工控行业需要熟悉的工业级通信协议
  • 力扣题解(1030. 距离顺序排列矩阵单元格),带注释
  • 每天一道leetcode:剑指 Offer 34. 二叉树中和为某一值的路径(中等图论深度优先遍历递归)
  • 利用POM完成脚本分离实现企业级自动化(POM设计模式+页面的框架封装+测试报告截图)
  • 嵌入式设计中对于只有两种状态的变量存储设计,如何高效的对循迹小车进行偏差量化
  • day53 第九章 动态规划part14● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划
  • shell编程 基础
  • 人工智能在网络安全中的应用: 分析人工智能、机器学习和深度学习等技术在预测、检测和应对网络攻击中的作用
  • 使用 Redis 实现异步队列
  • RocketMQ、Dashboard部署以及安全设置
  • Android AlarmManager设置闹钟
  • 【C# 基础精讲】LINQ to XML查询
  • Java学习笔记——(20)标识符命名规则和规范
  • 过滤字符,绕过
  • Apache Doris 入门教程32:物化视图
  • PHP substr()函数详解,PHP截取字符串。
  • 关于flink-sql-connector-phoenix的重写逻辑
  • Django进阶:DRF(Django REST framework)
  • Flink CDC系列之:Oracle CDC 导入 Elasticsearch
  • Linux忘记root密码解决方法
  • AR/VR眼镜转接器方案,实现同时传输视频快充方案
  • ASP.NET Core中路由规则匹配
  • IDEA:Error running,Command line is too long. 解决方法
  • 什么是反射机制?为什么反射慢?
  • list元素
  • OkHttp 源码浅析一
  • 【解决问题】远程仓库GitHub/GitLab添加了SSH Key之后依然无法clone的解决办法