luogu-B4066 [GESP202412 三级] 数字替换

luogu-B4066 [GESP202412 三级] 数字替换

GESP三级真题,一维数组相关题目,难度★★☆☆☆。

luogu-B4066 [GESP202412 三级] 数字替换

题目要求

题目描述

小杨有一个包含 nn 个数字的序列 AA,即 A=[a1,a2,,an]A=[a_1,a_2,\ldots,a_n],他想将其中大于 kk 的数字都替换为序列的最大值,将其中小于 kk 的数字都替换为序列的最小值,请你帮他计算出替换后的序列。

输入格式

第一行包含两个正整数 n,kn,k,含义如题面所示。

第二行包含 nn 个数字,代表序列 AA

输出格式

输出 nn 个整数,代表替换后的结果。

输入输出样例 #1

输入 #1

5 0
-2 -1 0 1 2

输出 #1

-2 -2 0 2 2

说明/提示

对于全部数据,保证有 1n1051\le n\le 10^5k,ai105|k|,|a_i|\le 10^5


题目分析

解题思路

本题的解题思路如下:

  1. 输入处理:

    • 读取序列长度n和基准值k
    • 读入n个整数构成序列A
  2. 核心逻辑:

    • 在读入序列的同时找出序列中的最大值和最小值
    • 遍历序列中的每个数字:
      • 如果数字大于k,替换为最大值
      • 如果数字小于k,替换为最小值
      • 等于k的数字保持不变
    • 按顺序输出处理后的序列

复杂度分析:

  • 时间复杂度:O(n)O(n),只需要遍历一次序列
  • 空间复杂度:O(n)O(n),需要存储长度为n的序列

{% include custom/custom-post-content-inner.html %}


示例代码

#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;
}

{% include custom/custom-post-content-footer.md %}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
Last updated on