这是一个典型的字符串处理题目。其核心思路是解析“字符+数字”的组合。
解题思路
1. 扫描字符串:我们需要遍历整个输入字符串。
2. 提取字符与数字:
- 读取到一个字母时,将其暂存起来(因为这是我们需要重复输出的字符)。
- 读取到数字时,注意它可能不止一位(例如
a12表示'a'出现了 12 次),所以需要将连续的数字字符拼凑成一个完整的整数。
3. 还原明文:每当读取到一个完整的数字,就将暂存的字符按照这个数字的次数输出。
C++ 代码实现
#include <iostream>
#include <string>
#include <cctype> // 用于 isdigit()
using namespace std;
int main() {
// 提速输入输出
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s;
cin >> s;
char current_char; // 暂存当前要重复的字符
int n = s.length();
int i = 0;
while (i < n) {
// 1. 读取字符
if (isalpha(s[i])) {
current_char = s[i];
i++;
}
// 2. 读取数字(处理多位数)
string num_str = "";
while (i < n && isdigit(s[i])) {
num_str += s[i];
i++;
}
// 将数字字符串转为整数
int count = stoi(num_str);
// 3. 输出字符
for (int j = 0; j < count; ++j) {
cout << current_char;
}
}
return 0;
}
给初学者的要点说明:
isalpha()和isdigit():这是 C++<cctype>库提供的非常实用的函数,分别用于判断一个字符是否为字母或数字,使用它们可以让代码逻辑更清晰。- 处理多位数字:题目虽然例子很简单,但作为一种严谨的算法题,数字部分一定要用
while循环将其完整提取出来,不能只取一位。例如输入a10,你需要将其识别为10而不是1。 stoi()函数:可以将字符串转换为对应的整数。- 性能优化:由于解压后的明文长度可能达到 ,直接使用
cout在数据量非常大时可能会慢。但在本题规模下通常是可以接受的。如果遇到极端的运行时间要求,可以将输出存入一个std::string或使用printf来加速。
这种“游程编码”(Run-Length Encoding)还原是学习字符串解析的入门好题,理解了如何区分“字母”和“数字”的逻辑,你就掌握了此类问题的精髓!
暂无评论