题目:1078 字符串压缩与解压 - PAT (Basic Level) Practice (中文) (pintia.cn)
刚开始先读一个字符,根据这个字符是'C'还是'D'来决定是压缩还是解压缩。
我们先写'C'的逻辑:
这里我们用逆向思维,先让t++,然后我们去遍历给定的字符串,如果S[i]和S[i+1]不相等,这个时候就该停止t++了,并且要把t置空。
然后这个时候我们用一个空字符串+t+s[i] (得到的就是压缩的字符串)
但是我们发现结果如下:

Debug:
当遇到的字符相同个数是1的时候我们应该直接加这个字符串而不应该把'1'也加上。
Debug:
当i在最后一位的时候,没有s[i+1]进行比较了,我们应该直接把s[i]加上:
写'D'的逻辑:
Debug:
单个的字符我们没有加上:

修改:

code
js
#include<bits/stdc++.h>
using namespace std;
string f1(string s)
{
string ans;
//逆向思维
//首先让t++,然后遍历一下字符串,判断如果遇到两个不相同的停止t++
int t=0;
for(int i=0;i<s.size();i++)
{
t++;
if(i+1!=s.size()&&s[i]!=s[i+1]||i+1==s.size())
{
if(t==1)ans+=s[i];
else ans+=to_string(t)+s[i];
t=0;
}
}
return ans;
}
string f2(string s)
{
string ans;
for(int i=0;i<s.size();i++)
{
if(isdigit(s[i]))
{ int index=0,count=0;
for(int j=i;j<s.size();j++)
{
count=count*10+s[j]-'0';
if(s[j+1]>'9'||s[j+1]<'0')
{
index=j+1;
break;
}
}
for(int k=1;k<=count;k++)
{
ans+=s[index];
i=index;
}
}
else
ans+=s[i];
}
return ans;
}
int main()
{
char op;cin>>op;getchar();
if(op=='C')
{
//压缩
string s1;getline(cin,s1);
cout<< f1(s1);
}
if(op=='D')
{
string s1;getline(cin,s1);
cout<< f2(s1);
}
return 0;
}