PAT 字符串压缩与解压 20分 独立完成19分

458 阅读2分钟

题目: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;
}

image.png

解析:78_哔哩哔哩_bilibili

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;
}