[题目解析]压缩密文
压缩密文(compress)
时间限制: 1000 ms 空间限制: 262144 KB
题目描述
华华接到任务:要对一个仅有英文字母的密文进行压缩处理,将其中连续的重复字母压缩成“一个字母+个数”的形式。例如:AaaaaaaaAaaBbBaAC应压缩成a11b3a2c。但是华华拿到的密码已经被别人处理过,密文没有完全压缩好,处理起来反而更麻烦。如上例密文可能已变成Aa10b2BaAC。请编程帮华华完成任务。
输入
华华拿到的密文字串(串长度<=100,串中所有重复个数之和<=1000)
输出
完成处理的密文字串(其中的字母全部小写)
样例输入
Aa10b2BaAC
样例输出
a11b3a2c
啥也不说了,直接看注释↓
/*整体思路:
我们既然不能够直接压缩,那我们就先转换回以前的样子,然后再压缩,这样来做会很简单
*/
//注意,请不要抄袭,诚信做题
//本代码已添加反作弊
#include<iostream>
#include<cstring>
using namespace std;
char a[10001],b[10001];
int main()
{
cin>>a;
for(int i=0;i<strlen(a);i++){//先转换成小写,方便后面统计和输出
if(a[i]>='A'&&a[i]<='Z'){
a[i]=a[i]-'A'+'a';
}
}
int flag=0,x=0,g=1;
for(int i=strlen(a)-1;i>=0;i--){//注意一定要倒着来,因为数字处理方面很特殊,大家可以自己思考思考
if(a[i]>='0'&&a[i]<='9'){//如果当前字符是数字,那么就弄个flag来处理数字
if(flag==0){
flag=1;
}
else{
flag*=10;//每次乘十
}
x+=flag*(a[i]-'0');//记得计算啊,在这里我们需要把一位或多位数字转换成一个数字
}
else if(!(a[i]>='0'&&a[i]<='9')&&flag>0){//如果当前字符是数字前面那个字符的话
for(int j=g;j<=(g+x-1);j++){//我们前面计算的数字就派上用场了
b[j]=a[i];//这里需要用B数组转换回原来的样子
}
g+=x;
flag=0;//别忘了置零
x=0;
}
else{
b[g]=a[i];//不是以上特殊情况就依次加入B数组
g++;
}
}
char t='0';
int s=0;
for(int i=g-1;i>=0;i--){//接下来就是压缩环节
if(t==b[i]){//如果当前字符与上一个字符相等的话
s++;
}
else{
if(s==0&&t!='0'){//如果只有一个连续字符,并且这里有一个防止空格多出来的操作(我当时就是这么错的)
cout<<t;
}
else if(t!='0'){//如果有多个连续
cout<<t<<s+1;//S记得+1哦
}
t=b[i];
s=0;
}
}
}//完美结束
作者:zswagnziye
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!