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语言:

cpp 复制代码
#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++:

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

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

相关推荐
黑听人4 分钟前
【力扣 中等 C++】90. 子集 II
开发语言·数据结构·c++·算法·leetcode
虾球xz27 分钟前
CppCon 2015 学习:Algorithmic Differentiation C++ & Extremum Estimation
开发语言·c++·学习
黑听人28 分钟前
【力扣 简单 C】21. 合并两个有序链表
c语言·开发语言·数据结构·算法·leetcode
什么半岛铁盒38 分钟前
C++信号处理程序解析与改进
linux·c++·信号处理
励志成为大佬的小杨1 小时前
时间序列基础
人工智能·算法
ling__wx1 小时前
go部分语法记录
数据结构
黑听人1 小时前
【力扣 简单 C】83. 删除排序链表中的重复元素
c语言·开发语言·数据结构·算法·leetcode
微凉的衣柜1 小时前
机器人导航中的高程图 vs 高度筛选障碍物点云投影 —— 如何高效处理避障问题?
算法·机器人
Shaun_青璇2 小时前
Cpp 知识3
开发语言·c++·算法
景彡先生2 小时前
C++中的RAII技术:资源获取即初始化
开发语言·c++