PAT1078 字符串压缩与解压 (c++实现)—乙级真题(博&人&)
程序员文章站
2022-07-14 20:32:07
...
PAT1078 字符串压缩与解压 (c++实现)—乙级真题
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba。解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。
输入格式:
输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过 1000 个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过 1MB。输出格式:
根据要求压缩或解压字符串,并在一行中输出结果。分析 :
首先判断是压缩还是合并,
对于压缩:定义temp用于存放当前的字符。定义num用于存放与当前字符相同的个数。将字符串的第一个元素赋值给temp,给num赋值为1,如果后面的元素与第一个元素相同,则num++,并且删除访问当前元素的前面一个元素,(注:像这样ss,删除第一个s),直到找到与temp不同的字符,注意:如果num的值大于1则将num的值插在访问元素的前面两个位置,并将该元素赋值给temp,num置为1。如果等于1就不需要插,只需要给temp赋值。 (如sssa,第一步变为ssa,num=2,第二步变为sa,num=3,第三步此时访问的元素为a,temp是s,num等于3,将3插在a的前面两个位置,3sa)
对于合并:只需要判断是否为数字,如果是数字则删除该数字,并将数字赋值给变量n,并在下一个字符前插入该字符n-1次,因为第n次就是该字符,(如5a,变为aaaaa,在字符a前插入自身4次)
对于压缩:定义temp用于存放当前的字符。定义num用于存放与当前字符相同的个数。将字符串的第一个元素赋值给temp,给num赋值为1,如果后面的元素与第一个元素相同,则num++,并且删除访问当前元素的前面一个元素,(注:像这样ss,删除第一个s),直到找到与temp不同的字符,注意:如果num的值大于1则将num的值插在访问元素的前面两个位置,并将该元素赋值给temp,num置为1。如果等于1就不需要插,只需要给temp赋值。 (如sssa,第一步变为ssa,num=2,第二步变为sa,num=3,第三步此时访问的元素为a,temp是s,num等于3,将3插在a的前面两个位置,3sa)
对于合并:只需要判断是否为数字,如果是数字则删除该数字,并将数字赋值给变量n,并在下一个字符前插入该字符n-1次,因为第n次就是该字符,(如5a,变为aaaaa,在字符a前插入自身4次)
代码如下 :
#include<iostream>
#include<string>
using namespace std;
int main(){
char c;
cin>>c;
getchar();
string t;
getline(cin,t);
if(c=='C'){
char temp=t[0];
int sum=1;
for(int i=1;i<=t.size();++i){
if(temp==t[i]){
t.erase(i-1,1);
i--;
sum++;
}else if(temp!=t[i]){
temp=t[i];
if(sum!=1){
string a=to_string(sum);
t.insert(i-1,a);
sum=1;
i=i+a.size();
}
}
}
}else if(c=='D'){
for(int i=0;i<t.size();){
int sum=0;
while(t[i]>='0'&&t[i]<='9'){
sum=sum*10+t[i]-'0';
t.erase(i,1);
}
if(sum!=0){
t.insert(i,sum-1,t[i]);
i+=sum;
}else{
i++;
}
}
}
cout<<t;
return 0;
}
测试截图 :
上一篇: 使用npm安装TypeScript
下一篇: LinkList源码解析