题解:洛谷 AT_abc436_a o-padding
【题目来源】
洛谷:AT_abc436_a [ABC436A] o-padding - 洛谷
【题目描述】
给定一个整数 \(N\) 和一个只包含小写英文字母的字符串 \(S\),其中 \(S\) 的长度小于 \(N\)。
请输出一个新的字符串,该字符串通过不断在 \(S\) 的开头添加小写字母 o,直到其长度变为 \(N\) 为止。
【输入】
输入通过标准输入给出,格式如下:
\(N\) \(S\)
【输出】
输出答案。
【输入样例】
5
abc
【输出样例】
ooabc
【核心思想】
-
问题分析:给定目标长度 \(N\) 和一个长度小于 \(N\) 的字符串 \(S\),需要在 \(S\) 的开头不断添加字符
o,直到字符串长度恰好为 \(N\)。这是一个字符串构造/直接模拟问题,关键在于计算需要补充的o的个数并控制输出顺序。 -
算法选择:
- 直接构造:计算需要补充的字符数 \(N - |S|\),先输出对应数量的
o,再输出原字符串 \(S\)
- 直接构造:计算需要补充的字符数 \(N - |S|\),先输出对应数量的
-
关键步骤:
- 读取输入:读入整数 \(N\) 和字符串 \(S\)
- 计算缺口:\(need = N - |S|\),即需要补充的
o的个数 - 输出填充字符:循环 \(need\) 次,每次输出一个
o - 输出原字符串:输出 \(S\)
- 换行结束
-
时间/空间复杂度:
- 时间复杂度:\(O(N)\),输出 \(N\) 个字符
- 空间复杂度:\(O(1)\),无需额外存储(若不考虑输入字符串本身)
-
字符串构造的核心思想:
- 顺序控制:由于只能在开头添加,必须先输出填充字符再输出原串,体现"先补后原"的构造顺序
- 长度守恒:最终长度严格等于 \(N\),通过 \(N - |S|\) 精确控制填充量
- 适用于规则明确的字符串格式化与构造类问题
【算法标签】
入门 #字符串入门
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n; // 总长度
string s; // 输入的字符串
int main()
{
// 输入总长度n和字符串s
cin >> n >> s;
// 在字符串前面补充字符'o',使总长度达到n
// 需要补充的'o'个数为:n - s.size()
for (int i = 1; i <= n - s.size(); i++)
{
cout << "o"; // 输出字符'o'
}
// 输出原始字符串s
cout << s << endl;
return 0;
}
【运行结果】
5
abc
ooabc
浙公网安备 33010602011771号