信奥AC之路-3级
-
第一课:数组基础4 主题|小节
-
第二课:数组基础二6 主题|小节
-
第三课:数组基础三6 主题|小节
-
第四课:数组基础四7 主题|小节
-
第五课:数组基础五5 主题|小节
-
第六课:数组用于统计,去重,排序5 主题|小节
-
第七课:冒泡排序6 主题|小节
-
第八课:数组连续性元素6 主题|小节
-
第九课:数组综合一7 主题|小节
-
第十课:字符数组7 主题|小节
-
第十一课:字符数组基础应用5 主题|小节
-
第十二课:字符数组基础应用二6 主题|小节
-
第十三课:字符数组进阶6 主题|小节
-
第十四课:字符串进阶二6 主题|小节
-
第十五课:字符串(STL)9 主题|小节
-
第十六课:字符串基础6 主题|小节
-
第十七课:字符串函数6 主题|小节
-
第十八课:字符串函数二4 主题|小节
-
第十九课:sort函数7 主题|小节
-
第二十课:字符串进阶7 主题|小节
-
第二十一课:字符串进阶二6 主题|小节
-
第二十二课:进制转换--十进制转其他进制5 主题|小节
-
第二十三课:进制转换--其他进制转十进制5 主题|小节
-
第二十四课:二进制,八进制,十六进制转换5 主题|小节
-
第二十五课:数据编码基础6 主题|小节
-
第二十六课:位运算基础6 主题|小节
“小朋友们,了解了数组的基础知识后,让我们来看看如何处理数组中的元素!”我兴奋地说,”最常见的操作就是查找数组中的最大值、最小值及其位置。”
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;
}
算法解析:
- 首先初始化最大值为系统允许的最小整数值(INT_MIN)
- 遍历数组中的每个元素
- 对于每个元素,如果它大于当前记录的最大值,则更新最大值
- 遍历完成后,输出找到的最大值
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开始存储和处理数组元素(注意:这是为了让位置编号从1开始)
- 在输入每个元素的同时,判断它是否大于当前记录的最大值
- 如果是,则更新最大值并记录当前的位置
- 最后输出记录的位置
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.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;
}
算法解析:
- 初始化最小值为系统允许的最大整数(INT_MAX)
- 遍历数组中的每个元素
- 如果当前元素小于已知的最小值,则更新最小值
- 最后输出找到的最小值
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.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_C_11_find_min_last_position.svg:展示查找最小值最后出现位置的算法流程及对比,特别是<和