[题目解析]压缩密文

压缩密文(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;
  }
 }
}//完美结束 
posted @ 2022-03-25 20:11  zswangziye  阅读(65)  评论(0编辑  收藏  举报