7-3 简码(20 分)

134 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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;
}

结果分析:

image.png PS: 成功解题=理清思路+一定的技巧~