前言
字符串处理需熟练。
下学期开学前的上学期期末复习。
题干
问题描述
有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。
例如,字符串aaaaabbbabaaaaaaaaaaaaabbbb可压缩为a5b3aba13b4。
请设计一个程序,将采用该压缩方法得到的字符串解压缩,还原出原字符串并输出。
输入说明
输入数据为一个字符串(长度不大于50,只包含字母和数字),表示压缩后的字符串
输出说明
在一行上输出解压缩后的英文字符串(长度不超过100),最后换行。
输入样例
a5b3aba13b4
输出样例
aaaaabbbabaaaaaaaaaaaaabbbb
解析
看似简单,但存在几个思维盲点:
- 数字若为两/三位数的处理(占用两/三个字符)
- 数字是前一个字母的重复次数
- 大小写字母均可,勿被样例迷惑 漏大写字母情况
- 下标在变
- 同个字母重复三次及以上才压缩
解答
#include<stdio.h>
#include<string.h>
int main(){
char a[50],c;
int len,i,j,num=0;
gets(a);
len=strlen(a);
for(i=0;i<len;i++){
if(a[i]>='a' && a[i]<='z' || a[i]>='A' && a[i]<='Z'){
for(j=0;j<num-1;j++){
printf("%c",c);
}
num=0;c=a[i];
printf("%c",c);
}
if(a[i]>='0' && a[i]<='9'){
num=num*10+a[i]-48;//num是连续出现的次数
//若出现次数>=10则要计算次数,char->int,减去'0'的ASCII码值48
}
}
for(i=0;i<num-1;i++){
printf("%c",c);
}
printf("\n");
return 0;
}