小明有一串很长的英文字母,可能包含大写和小写。在这串字母中,有很多字母是连续且重复的。小明想了一个个将这串字母表达得更短的办法:将连续的几个相同的字母写成“字母+出现次数”的形式。例如,连续的5个,即可以简写成a5(也可以简写成等)。对于这串字母:小明可以简写成H3el5o2。为了方便表达小
明不会将超过9个连续相同的字母写成简写的形式。现在给出简写后的字符串,请帮助小明将其还原成原来的字符串。
[输入格式]
输入一个字符串。
[输出格式]
输出一个字符串,表示还原后的字符串。[样例输入]
H3el5o2 [样例输出]
[评测用例规模与约定]
对于所有评测用例,字符串均由大小写英文字母和数字组成,长度不超过100。注意:原来的字符串长度可能超过100。
提示:
本题可以采用模拟法求解,将每个元素都遍历一遍即可,分为以下两种情况。
①若当前元素是字符,且下一个元素是数字,则需要循环输出当前字符,循环输出的次数就是数字的值。
②若当前元素和下一个元素都是字符,则将这个字符输出一遍。
#include
using namespace std;
int main(){
char str[100];
string s;
cin>>s;
for(int i=0;i<=s.size();i++){
if('0'1]<='9'&&s[i]>'9')//本位字母下一位是数字
{
for(int j=0;j1]-'0';j++)
cout<if(s[i]>'9'&&s[i+1]>'9')//都是字母
cout<
修改如下:
#include <iostream>
using namespace std;
int main() {
char str[100];
string s;
cin >> s;
for (int i = 0; i < s.size(); i++) {
if ('0' < s[i + 1]&&s[i+1]<= '9' && s[i] > '9')//本位字母下一位是数字
{
for (int j = 0; j < s[i + 1] - '0'; j++)
cout << s[i];
}
if (s[i] > '9' && s[i + 1] > '9')//都是字母
cout << s[i];
}
}
详细解答如下,望采纳:
① 你的代码中,当前的元素是数字的时候,你会直接输出这个数字,而不是将它转化为对应的字符输出。例如,当遍历到字符 '3' 时,你会直接输出 3,而不是输出三个 'H'。
② 你的代码中,当前的元素是字符的时候,你会检查下一个元素是否为数字,如果是,则输出当前字符。但是,在最后一个字符时,由于数组是从 0 开始下标的,所以最后一个字符的下标是字符串的长度减 1。所以,当 i 等于字符串的长度减 1 时,下一个元素不存在,不能访问。
修改后的代码如下:
#include <iostream>
using namespace std;
int main(){
char str[100];
string s;
cin>>s;
for(int i=0;i<s.size();i++){
if('0'<s[i+1]<='9'){
int a=s[i+1]-'0';
for(int j=1;j<=a;j++){
cout<<s[i];
}
i++;
}else{
cout<<s[i];
}
}
return 0;
}