携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
题目描述:
小明有一串很长的英文字母,可能包含大写和小写。在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母+出现次数的形式。例如,连续的5个a,即 aaaaa,简写成 a5。对于这个例子:aaaaaCCeeelHH,小明可以简写成 a5C2e3lH2。为了方便表达,小明不会将连续的超过9个相同的字符写成简写的形式。
现在给出一串字符串,请帮助小明完成简写。
输入格式:
输入一行为一个由大写字母和小写字符构成的字符串,长度不超过100000。
输出格式:
输出为一行字符串,表示简写后的字符串。
输入样例:
aaaaaCCeeelHH
输出样例:
a5C2e3lH2
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
PS: 也许有的同学遇到过好像的题目,没错这题的母题就是蓝桥杯的解码,两者之间的区别仅仅是反过来了
思路分析:
1.先设置一个计数器
2.当计数器为1时,不需要输出数字,只需要输出字母即可
3.当计数器大于1且小于等于9时,将这一连串的字母变成一个后面加上计数器的数字即可
4.注意当计数器的数字大于9时,我们不需要对其作出任何处理,直接循环输出即可~
代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
cin >> s;
for (int i = 0; i < s.size(); i++) {
int cnt = 0;
for (int j = i; j < s.size(); j++) {
if (s[i] == s[j])
cnt++;
else
break;
}
if (cnt > 1 && cnt <= 9)
cout << s[i] << cnt;
else if (cnt == 1)
cout << s[i];
else if (cnt > 9)
for (int j = 0; j < cnt; j++)
cout << s[i];
i = i + cnt - 1;
}
return 0;
}
结果分析:
PS: 成功解题=理清思路+一定的技巧~