1. 程式人生 > >PAT-1078 字串壓縮與解壓

PAT-1078 字串壓縮與解壓

1078 字串壓縮與解壓 (20 分)

文字壓縮有很多種方法,這裡我們只考慮最簡單的一種:把由相同字元組成的一個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如 ccccc 就用 5c 來表示。如果字元沒有重複,就原樣輸出。例如 aba 壓縮後仍然是 aba

解壓方法就是反過來,把形如 5c 這樣的表示恢復為 ccccc

本題需要你根據壓縮或解壓的要求,對給定字串進行處理。這裡我們簡單地假設原始字串是完全由英文字母和空格組成的非空字串。

輸入格式:

輸入第一行給出一個字元,如果是 C 就表示下面的字串需要被壓縮;如果是 D 就表示下面的字串需要被解壓。第二行給出需要被壓縮或解壓的不超過 1000 個字元的字串,以回車結尾。題目保證字元重複個數在整型範圍內,且輸出檔案不超過 1MB。

輸出格式:

根據要求壓縮或解壓字串,並在一行中輸出結果。

輸入樣例 1:

C
TTTTThhiiiis isssss a   tesssst CAaaa as

輸出樣例 1:

5T2h4is i5s a3 te4st CA3a as

輸入樣例 2:

D
5T2h4is i5s a3 te4st CA3a as10Z

輸出樣例 2:

TTTTThhiiiis isssss a   tesssst CAaaa asZZZZZZZZZZ
#include<iostream>
#include<string>
using namespace std;
void chuli1()
{
  string s;
  getline(cin,s);
  int l=s.length();
  for(int i=0;i<l;i++)
  {
    int count=0;
    while(s[i]==s[i+1])
    {
      i++;
      count++;
    }
    if(count!=0)
    {
      cout<<count+1;
    }
    cout<<s[i];
  }
}
void chuli2()
{
  string s;
  int sum=0;
  getline(cin,s);
  int l=s.length();
  for(int i=0;i<l;i++)
  {
    sum=0;
    while(s[i]>='0'&&s[i]<='9')
    {
      sum=sum*10+s[i]-'0';//注意此處要減去‘0’得到數
      i++;
    }
    if(sum>0)
    {
      for(int j=0;j<sum;j++)
      {
        cout<<s[i];
      }
    }
    else
    {
      cout<<s[i];
    }
  }
}
int main()
{
  char a;
  cin>>a;
  getchar();//下面輸入用getline()的話,此處就要用getchar()吞掉回車
  if(a=='C')
  {
    chuli1();
  }
  if(a=='D')
  {
    chuli2();
  }
  cout<<endl;
  return 0;
}