返回 课程

信奥AC之路-3级

0% 完成
0/0 步骤
  1. 第一课:数组基础
    4 主题|小节
  2. 第二课:数组基础二
    6 主题|小节
  3. 第三课:数组基础三
    6 主题|小节
  4. 第四课:数组基础四
    7 主题|小节
  5. 第五课:数组基础五
    5 主题|小节
  6. 第六课:数组用于统计,去重,排序
    5 主题|小节
  7. 第七课:冒泡排序
    6 主题|小节
  8. 第八课:数组连续性元素
    6 主题|小节
  9. 第九课:数组综合一
    7 主题|小节
  10. 第十课:字符数组
    7 主题|小节
  11. 第十一课:字符数组基础应用
    5 主题|小节
  12. 第十二课:字符数组基础应用二
    6 主题|小节
  13. 第十三课:字符数组进阶
    6 主题|小节
  14. 第十四课:字符串进阶二
    6 主题|小节
  15. 第十五课:字符串(STL)
    9 主题|小节
  16. 第十六课:字符串基础
    6 主题|小节
  17. 第十七课:字符串函数
    6 主题|小节
  18. 第十八课:字符串函数二
    4 主题|小节
  19. 第十九课:sort函数
    7 主题|小节
  20. 第二十课:字符串进阶
    7 主题|小节
  21. 第二十一课:字符串进阶二
    6 主题|小节
  22. 第二十二课:进制转换--十进制转其他进制
    5 主题|小节
  23. 第二十三课:进制转换--其他进制转十进制
    5 主题|小节
  24. 第二十四课:二进制,八进制,十六进制转换
    5 主题|小节
  25. 第二十五课:数据编码基础
    6 主题|小节
  26. 第二十六课:位运算基础
    6 主题|小节
课 1, 主题|小节 3
进行中

1.3 数组的常见操作

2025年9月22日
课 进展
0% 完成

“小朋友们,了解了数组的基础知识后,让我们来看看如何处理数组中的元素!”我兴奋地说,”最常见的操作就是查找数组中的最大值、最小值及其位置。”

1.3.1 查找最大值

题目描述: 给定n个整数(n不超过100),请找出这些整数中的最大值并输出。

输入格式: 第一行包含一个整数n,表示整数的个数。 第二行包含n个整数,用空格分隔。

输出格式: 输出一个整数,表示这n个整数中的最大值。

样例输入

5
8 3 12 6 9

样例输出

12

代码实现

#include <iostream>
#include <climits>
using namespace std;

int main() {
    int n, a[110];
    cin >> n;
    int ma = INT_MIN;  // 初始化最大值为最小的整数
    for(int i = 0; i < n; i++) 
        cin >> a[i];   // 输入n个整数
    
    for(int i = 0; i < n; i++) {
        if(a[i] > ma) 
            ma = a[i]; // 如果当前元素大于已知最大值,则更新最大值
    }
    cout << ma;        // 输出最大值
    return 0;
}

算法解析

  1. 首先初始化最大值为系统允许的最小整数值(INT_MIN)
  2. 遍历数组中的每个元素
  3. 对于每个元素,如果它大于当前记录的最大值,则更新最大值
  4. 遍历完成后,输出找到的最大值

1.3.2 查找最大值的位置(互不相等的数)

题目描述: 给定n个互不相等的整数(n不超过100),请找出这些整数中的最大值的位置(位置从1开始编号)并输出。

输入格式: 第一行包含一个整数n,表示整数的个数。 第二行包含n个互不相等的整数,用空格分隔。

输出格式: 输出一个整数,表示最大值在输入序列中的位置(从1开始编号)。

样例输入

6
15 7 23 9 18 5

样例输出

3

代码实现

#include <iostream>
#include <climits>
using namespace std;

int main() {
    int n, a[110];
    cin >> n;
    int ma = INT_MIN, k;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        if(a[i] > ma) {
            ma = a[i];  // 更新最大值
            k = i;      // 记录最大值的位置
        }
    }
    cout << k;  // 输出最大值的位置
    return 0;
}

算法解析

  1. 初始化最大值为系统允许的最小整数
  2. 从索引1开始存储和处理数组元素(注意:这是为了让位置编号从1开始)
  3. 在输入每个元素的同时,判断它是否大于当前记录的最大值
  4. 如果是,则更新最大值并记录当前的位置
  5. 最后输出记录的位置

1.3.3 查找最大值的最后出现位置

题目描述: 给定n个整数(n不超过100),请找出这些整数中的最大值的位置。如果最大值在序列中出现多次,请找出它最后一次出现的位置。

输入格式: 第一行包含一个整数n,表示整数的个数。 第二行包含n个整数,用空格分隔。

输出格式: 输出一个整数,表示最大值最后一次出现的位置(从1开始编号)。

样例输入

8
4 9 3 9 5 2 7 9

样例输出

8

代码实现

#include <iostream>
#include <climits>
using namespace std;

int main() {
    int n, a[110];
    cin >> n;
    int ma = INT_MIN, k;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        if(a[i] >= ma) {  // 注意这里使用 >= 而不是 >
            ma = a[i];
            k = i;
        }
    }
    cout << k;  // 输出最大值最后出现的位置
    return 0;
}

算法解析

  1. 初始化过程与前一个例题相同
  2. 关键区别在于条件判断:使用>=而不是>
  3. 这样,当遇到一个等于当前最大值的元素时,仍然会更新位置
  4. 最终记录的位置将是最大值最后一次出现的位置

1.3.4 查找最小值

题目描述: 给定n个整数(n不超过100),请找出这些整数中的最小值并输出。

输入格式: 第一行包含一个整数n,表示整数的个数。 第二行包含n个整数,用空格分隔。

输出格式: 输出一个整数,表示这n个整数中的最小值。

样例输入

7
12 8 5 15 9 3 7

样例输出

3

代码实现

#include <iostream>
#include <climits>
using namespace std;

int main() {
    int n, a[110];
    cin >> n;
    int mi = INT_MAX;  // 初始化最小值为最大的整数
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        if(a[i] < mi) {
            mi = a[i];  // 如果当前元素小于已知最小值,则更新最小值
        }
    }
    cout << mi;  // 输出最小值
    return 0;
}

算法解析

  1. 初始化最小值为系统允许的最大整数(INT_MAX)
  2. 遍历数组中的每个元素
  3. 如果当前元素小于已知的最小值,则更新最小值
  4. 最后输出找到的最小值

1.3.5 查找最小值的第一次出现位置

题目描述: 给定n个整数(n不超过100),请找出这些整数中的最小值第一次出现的位置(位置从1开始编号)。

输入格式: 第一行包含一个整数n,表示整数的个数。 第二行包含n个整数,用空格分隔。

输出格式: 输出一个整数,表示最小值第一次出现的位置。

样例输入

8
6 9 2 5 2 7 4 8

样例输出

3

代码实现

#include <iostream>
#include <climits>
using namespace std;

int main() {
    int n, a[110];
    cin >> n;
    int mi = INT_MAX, k;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        if(a[i] < mi) {
            mi = a[i];  // 更新最小值
            k = i;      // 记录最小值的位置
        }
    }
    cout << k;  // 输出最小值的第一次出现位置
    return 0;
}

算法解析

  1. 初始化最小值为系统允许的最大整数
  2. 遍历数组时,每当找到一个小于当前最小值的元素,就更新最小值和它的位置
  3. 由于只有在发现更小元素时才更新位置,因此记录的是最小值第一次出现的位置

1.3.6 查找最小值的最后出现位置

题目描述: 给定n个整数(n不超过100),请找出这些整数中的最小值最后一次出现的位置(位置从1开始编号)。

输入格式: 第一行包含一个整数n,表示整数的个数。 第二行包含n个整数,用空格分隔。

输出格式: 输出一个整数,表示最小值最后一次出现的位置。

样例输入

9
6 3 8 3 5 7 3 2 9

样例输出

8

代码实现

#include <iostream>
#include <climits>
using namespace std;

int main() {
    int n, a[110];
    cin >> n;
    int mi = INT_MAX, k;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        if(a[i] <= mi) {  // 注意这里使用 <= 而不是 <
            mi = a[i];
            k = i;
        }
    }
    cout << k;  // 输出最小值的最后一次出现位置
    return 0;
}

算法解析

  1. 初始化过程与前一个例题相同
  2. 关键区别在于条件判断:使用<=而不是<
  3. 这样,当遇到一个等于当前最小值的元素时,仍然会更新位置
  4. 最终记录的位置将是最小值最后一次出现的位置

<!– 图片位置 1_C_11_find_min_last_position.svg:展示查找最小值最后出现位置的算法流程及对比,特别是<和