1. 程式人生 > >1078. 字串壓縮與解壓 (20) PAT乙級真題

1078. 字串壓縮與解壓 (20) PAT乙級真題

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
做這道題的時候最好把壓縮和解壓分別寫函式分別除錯,這道題我考試的時候一開始code有個資料過不去,後來發現是判斷的時候不能“預判”下一個是不是字串結尾,而是判斷當前位置是不是字串結尾。不是難題,但是考試時耗了不少時間。程式碼如下:
#include<stdio.h>

void code(char a[]);
void decode(char a[]);


int main(void)
{
    char a[1050];
    char c;
    int n=0;
    scanf("%c%*c",&c);
    do
    {
        scanf("%c",&a[n++]);
    }while(a[n-1]!='\n');
    a[--n]='\0';
    if (c=='C') code(a);
    else decode(a);
    return 0;
}

void code(char a[])
{
    static int i,j;
    do
    {
        if (a[i]==a[i+1])
        {
            j=i;
            do
            {
                j++;
            }while(a[i]==a[j] && a[j]!='\0');
            printf("%d%c",j-i,a[i]);
            i=j;
        }
        else
        {
            printf("%c",a[i]);
            i++;
        }
    }while(a[i]!='\0');
}

void decode(char a[])
{
    static int i,j,s;
    do
    {
        if (a[i]>='0' && a[i]<='9')
        {
            s=0;
            do
            {
                s=s*10+(a[i]-'0');i++;
            }while(a[i]>='0' && a[i]<='9' && a[i]!='\0');
            for (j=0;j<s;j++) printf("%c",a[i]);i++;
        }
        else
        {
            printf("%c",a[i]);
            i++;
        }
    }while(a[i]!='\0');
}