文章

【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$。

题目分析

解题思路

本题的解题思路如下:

  1. 输入处理:
    • 读取序列长度n和基准值k
    • 读入n个整数构成序列A
  2. 核心逻辑:
    • 在读入序列的同时找出序列中的最大值和最小值
    • 遍历序列中的每个数字:
      • 如果数字大于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 进行授权