PAT Basic 1078. 字符串压缩与解压

发布时间 2023-04-09 13:26:09作者: 十豆加日月

PAT Basic 1078. 字符串压缩与解压

1. 题目描述:

文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba

解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc

本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。

2. 输入格式:

输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过 1000 个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过 1MB。

3. 输出格式:

根据要求压缩或解压字符串,并在一行中输出结果。

4. 输入样例:

C
TTTTThhiiiis isssss a   tesssst CAaaa as
D
5T2h4is i5s a3 te4st CA3a as10Z

5. 输出样例:

5T2h4is i5s a3 te4st CA3a as
TTTTThhiiiis isssss a   tesssst CAaaa asZZZZZZZZZZ

6. 性能要求:

Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB

思路:

根据题意分别对压缩和解压编写代码:

  • 关于压缩,维护变量lastCh记录上一个字符,当前字符tempCh与上一个字符相等时累加计数值,不等时根据计数值count进行输出。注意当count为1时不用输出1,最后需要进行尾处理。
  • 关于解压,当前字符tempCh为数字时累加计数值,不为数字时根据计数值count进行输出。

My Code:

#include <stdio.h>

int main(void)
{
    //char words[1001] = "";
    char mode = '\0';
    char tempCh = '\0', lastCh = '\0';
    int count = 0;
    int i=0; // iterator
    
    scanf("%c", &mode);
    getchar(); // consume '\n'
    
    if(mode == 'C') // compress mode
    {
        tempCh = getchar();
        lastCh = tempCh;
        count = 1;
        while((tempCh=getchar()) != '\n')
        {
            if(tempCh == lastCh) // meet continous same character
            {
                ++count;
            }
            else // need to output last character
            {
                if(count > 1)
                    printf("%d%c", count, lastCh);
                else
                    printf("%c", lastCh);
                count = 1;
            }
            lastCh = tempCh;
        }
        if(count > 1) // printf the last character, tail handle
            printf("%d%c", count, lastCh);
        else
            printf("%c", lastCh);
        count = 1;
        
        printf("\n"); // end a line
    }
    else if(mode == 'D')// decompress mode
    {
        while((tempCh=getchar()) != '\n')
        {
            if(tempCh >= '0' && tempCh <= '9') // current character is a number
            {
                count *= 10; // carry every bit
                count += tempCh - '0';
            }
            else // need to output
            {
                if(count) // have multiple character
                {
                    for(i=0; i<count; ++i)
                    {
                        printf("%c", tempCh);
                    }
                }
                else
                {
                    printf("%c", tempCh);
                }
                count = 0;
            }
        }
        printf("\n"); // end a line
    }
    
    return 0;
}