我们需要处理一个长度为 n 的整数序列 A。给定一个整数 k,要求将序列中大于 k 的数全部替换为原序列的最大值,将小于 k 的数全部替换为原序列的最小值,等于 k 的数保持不变。最终输出替换后的序列。
题目要求依赖于原序列的两个全局属性:最大值和最小值。因此,我们需要分两步完成:
求出整个序列的最大值与最小值。
最大值用于替换大于 k 的元素,最小值用于替换小于 k 的元素。
遍历序列,按照规则替换并输出。
对于每个元素 ai:
max 和 min 函数更新最大值和最小值:
以下参考代码使用 C++ 实现,步骤与上述算法一致。
cpp1#include <iostream> 2#include <vector> 3#include <algorithm> 4using namespace std; 5int a[100010]; // 全局数组,存储序列,长度大于等于 n 的最大值 6 7int main() { 8 int n, k; 9 cin >> n >> k; 10 11 // 读入序列,下标从 1 到 n 12 for (int i = 1; i <= n; i++) { 13 cin >> a[i]; 14 } 15 16 // 初始化最大值和最小值为第一个元素 17 int max_value = a[1], min_value = a[1]; 18 19 // 第一次遍历:找出真正的最大值和最小值 20 for (int i = 1; i <= n; i++) { 21 max_value = max(max_value, a[i]); 22 min_value = min(min_value, a[i]); 23 } 24 25 // 第二次遍历:替换并输出 26 for (int i = 1; i <= n; i++) { 27 if (a[i] > k) { 28 a[i] = max_value; // 大于 k 替换为最大值 29 } else if (a[i] < k) { 30 a[i] = min_value; // 小于 k 替换为最小值 31 } 32 // 等于 k 不处理 33 34 // 输出,同一个循环内完成 35 if (i != n) { 36 cout << a[i] << " "; // 数字间加空格 37 } else { 38 cout << a[i] << endl; // 行末输出换行 39 } 40 } 41 return 0; 42}
max 和 min 函数简化比较,它们都包含在 <algorithm> 头文件中。100010,是题目数据范围 105 之上多出 10 的常见写法,防止越界。if-else if 结构,保证了等于 k 的情况不会被错误替换。这道题主要考察基础循环和条件判断,是初学阶段的经典练习。希望题解能帮助你理解题意和实现方法。