题目:1078 字符串压缩与解压 - PAT (Basic Level) Practice (中文) (pintia.cn)
自己边调试边写的,过了19分:
#include<bits/stdc++.h>
using namespace std;
//压缩
void fun1(string s)
{
int cnt = 1; //算上自身所以是1
string ss;
//首先看一下相同的字母就count++;,这样count就存储了要压缩的字母的个数
for (int i = 0; i < s.size(); i++)
{
if (s[i] == s[i + 1])cnt++;
else
{
if (cnt == 1)ss += s[i]; //只有一个字符的话不要把数字加上,即1s,而是直接加s,即 s
else ss += to_string(cnt) + s[i]; //要压缩的字母个数+字母
cnt = 1; //重置
}
}
cout << ss<<endl;
}
//解压
void fun2(string s)
{
int index = 0;
string ss;
//解压的话我们需要看数字以及数字后面的字符
while (index < s.size())
{
if(isdigit(s[index])&&isdigit(s[index+1]))
{
int temp= (s[index] - '0') * 10 + (s[index + 1] - '0');
while (temp--)
{
if(index+2<s.size())
ss += s[index + 2];
}
index += 3;
}
else if (isdigit(s[index]))
{
int temp = s[index] - '0';
while (temp--)
{
if(index+1<s.size())
ss += s[index + 1];
}
index += 2;
}
else //字母
{
if(index<s.size())
{
ss += s[index];
index++;
}
}
}
cout << ss<<endl;
}
int main()
{
char c; cin >> c; getchar();
string s; getline(cin, s);
if (c == 'C')
fun1(s);
else if (c == 'D')
fun2(s);
return 0;
}
code
#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;
}