#include <bits/stdc++.h>
using namespace std;
int main(void) {
char s[101]; // 声明一个字符数组 s,用于存储输入的字符串,最大长度为 100(加上结束符 '\0')
cin >> s; // 从标准输入读取字符串 s
int length = 0; // 初始化长度变量
length = strlen(s); // 计算字符串 s 的长度
// 遍历字符串 s 中的每个字符
for (int i = 0; i < length; i++) {
// 检查当前字符的下一个字符是否是 '2' 到 '9' 的数字,表示重复次数
if (s[i + 1] > '1' && s[i + 1] <= '9') {
// 如果是,输出当前字符 s[i] 重复 s[i+1] 次
for (char j = '1'; j <= s[i + 1]; j++) {
cout << s[i]; // 输出当前字符
}
i++; // 跳过下一个字符,因为已经处理过重复次数
} else {
cout << s[i]; // 如果下一个字符不是数字,直接输出当前字符
}
}
}
解题思路
-
理解输入格式:
- 输入是一个经过压缩的字符串,其中某些字符后面可能跟着一个数字,表示该字符需要重复的次数。例如,
H3
表示字符H
重复 3 次,即HHH
。
- 输入是一个经过压缩的字符串,其中某些字符后面可能跟着一个数字,表示该字符需要重复的次数。例如,
-
遍历字符串:
- 我们需要遍历整个输入字符串,逐个检查每个字符。
- 当遇到一个字符时,需要判断它后面的下一个字符是否是一个数字(从 '2' 到 '9')。
-
处理字符和数字:
- 如果当前字符后面有数字,那么我们要将当前字符输出指定的次数,次数由这个数字决定。
- 如果没有数字,直接输出当前字符。
-
注意边界条件:
- 在遍历字符串时,注意不要越界。特别是在访问
s[i + 1]
时,要确保i + 1
不超过字符串的长度。
- 在遍历字符串时,注意不要越界。特别是在访问
-
输出结果:
- 在完成字符串遍历后,我们会得到还原后的完整字符串。
具体步骤
-
初始化:创建一个字符数组来存储输入字符串,并计算它的长度。
-
循环遍历:
- 从第一个字符开始,依次检查每个字符。
- 使用条件判断
if (s[i + 1] > '1' && s[i + 1] <= '9')
来确认下一个字符是否代表重复次数。 - 如果是,则根据数字决定重复的次数,并在内部循环中输出该字符。
- 如果不是,直接输出当前字符并继续。
-
优化与注意:
- 确保处理数字时转换为整数(
s[i + 1] - '0'
),以便于控制内部循环的次数。 - 使用
i++
跳过当前的数值字符,以避免重复处理。
- 确保处理数字时转换为整数(
实际例子
考虑输入 H3el5o2
的处理步骤:
- 读取字符
H
,看到3
,输出HHH
。 - 读取字符
e
,没有数字,直接输出e
。 - 读取字符
l
,看到5
,输出lllll
。 - 读取字符
o
,看到2
,输出oo
。 - 完成遍历,最终输出结果为
HHHellllloo
。
复杂度分析
- 时间复杂度:O(n),其中 n 是输入字符串的长度,因为我们只需遍历字符串一次。
- 空间复杂度:O(1),不使用额外的数据结构,只是简单的字符数组和一些变量。