【GESP】C++三级真题 luogu-B4066 [GESP202412 三级] 数字替换
GESP三级真题,一维数组相关题目,难度★★☆☆☆。
luogu-B4066 [GESP202412 三级] 数字替换
题目要求
题目描述
小杨有一个包含 $n$ 个数字的序列 $A$,即 $A=[a_1,a_2,\ldots,a_n]$,他想将其中大于 $k$ 的数字都替换为序列的最大值,将其中小于 $k$ 的数字都替换为序列的最小值,请你帮他计算出替换后的序列。
输入格式
第一行包含两个正整数 $n,k$,含义如题面所示。
第二行包含 $n$ 个数字,代表序列 $A$。
输出格式
输出 $n$ 个整数,代表替换后的结果。
输入输出样例 #1
输入 #1
1
2
5 0
-2 -1 0 1 2
输出 #1
1
-2 -2 0 2 2
说明/提示
对于全部数据,保证有 $1\le n\le 10^5$,$ | k | , | a_i | \le 10^5$。 |
题目分析
解题思路
本题的解题思路如下:
- 输入处理:
- 读取序列长度n和基准值k
- 读入n个整数构成序列A
- 核心逻辑:
- 在读入序列的同时找出序列中的最大值和最小值
- 遍历序列中的每个数字:
- 如果数字大于k,替换为最大值
- 如果数字小于k,替换为最小值
- 等于k的数字保持不变
- 按顺序输出处理后的序列
复杂度分析:
- 时间复杂度:$O(n)$,只需要遍历一次序列
- 空间复杂度:$O(n)$,需要存储长度为n的序列
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <cmath>
#include <iostream>
int main() {
// 声明变量n和k,分别表示序列长度和比较基准值
int n, k;
std::cin >> n >> k;
// 声明数组ary存储序列,并初始化最大值最小值变量
int ary[n];
int min_n = 100001; // 初始化为一个较大的值
int max_n = -100001; // 初始化为一个较小的值
// 读入序列并同时找出最大值和最小值
for (int i = 0; i < n; i++) {
std::cin >> ary[i];
min_n = std::min(min_n, ary[i]); // 更新最小值
max_n = std::max(max_n, ary[i]); // 更新最大值
}
// 遍历序列进行替换并输出
for (int i = 0; i < n; i++) {
if (ary[i] > k) {
ary[i] = max_n; // 大于k的数替换为最大值
} else if (ary[i] < k) {
ary[i] = min_n; // 小于k的数替换为最小值
}
std::cout << ary[i] << " "; // 输出处理后的数
}
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权