whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

PAT乙级1078 || 字符串压缩与解压(详解,C/C++示例,测试点分析)

Posted on 2019-12-29 In PAT

字符串压缩与解压

题目描述

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

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

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

输入格式

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

输出格式

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

输入样例1

1
2
C
TTTTThhiiiis isssss a tesssst CAaaa as

输出样例1

1
5T2h4is i5s a3 te4st CA3a as

输入样例2

1
2
D
5T2h4is i5s a3 te4st CA3a as10Z

输出样例2

1
TTTTThhiiiis isssss a   tesssst CAaaa asZZZZZZZZZZ

问题解决

解题思想

此题也很简单。压缩和解压分两大块来写就行了。注意getline读入字符串前,要把换行符先吸收掉;注意解压的时候某个字符的个数不一定是单位数字,这个要会处理,比如测试样例2的Z的个数是10个。

坑点提醒

None

代码示例(C/C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <cstring>

using namespace std;
int main() {
char tag, str[1010];
cin >> tag;
getchar(); //吸收换行
cin.getline(str, 1010); //需要被压缩或解压的字符串
if(tag == 'C') {
for(unsigned i = 0; i < strlen(str); ) {
unsigned j;
for(j = i; str[j] == str[i]; j++);
switch (j - i) {
case 1:
cout << str[i];
break;
default:
cout << j - i << str[i];
}
i = j;
}
}
else {
for(unsigned i = 0; i < strlen(str); i++) {
unsigned j, num = 0;
for(j = i; str[j] >= '0' && str[j] <= '9'; j++) {
num = num * 10 + (str[j] - '0');
}
i = j;
switch(num) {
case 0:
cout << str[i];
break;
default:
while(num--) {
cout << str[i];
}
}
}
}
return 0;
}

题目来源:PAT乙级1078
作者:CHEN, Yue
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1077 || 互评成绩计算(详解,C/C++示例,测试点分析)
PAT乙级1079 || 延迟的回文数(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 字符串压缩与解压
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例1
    5. 1.5. 输出样例1
    6. 1.6. 输入样例2
    7. 1.7. 输出样例2
    8. 1.8. 问题解决
      1. 1.8.1. 解题思想
      2. 1.8.2. 坑点提醒
      3. 1.8.3. 代码示例(C/C++)
© 2021 Mengzhao Wang