PAT B1078 字符串压缩与解压(C++)

PAT甲级目录 | PAT乙级目录

题目描述

B1078 字符串压缩与解压

解题思路

  • 压缩:

遍历字符串,记录遇到的第一个新字符 c,累加计数直到遇到和 c 不同的字符,计数值不足 1 说明该字符没有重复字符,直接输出 c,否则输出计数值和 c。

  • 解压:

遍历字符串,判断遇到的字符是否为数字,如果不是数字,说明没有重复的字符,直接输出该字符。如果遇到的字符为数字,说明该字符有重复,获取计数值,然后按照计数值输出字符。

易错点

  • 计数值可能会有多位,而不是一个数字

也许陌生的知识点

  • ans = ans + "某字符串"
    • 字符串拼接
    • 需要的头文件:string
  • y = stoi()
    • 实现将字符串转换成对应字面的整数
    • 类似的函数还有:
      • stod() 将字符串转换为 double 型数
      • stof() 将字符串转换为 float 型数
    • 需要的头文件:string
  • to_string()
    • 实现将一个数转换为字符串,这个数可以是整型或浮点型
    • 需要的头文件:string

代码示例:

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
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main(){
string temp, str, ans;
char c;
getline(cin, temp);
getline(cin, str);
if(temp == "C"){
for(int i = 0; i < str.length(); ){
int cnt = 0;
c = str[i];
while(i < str.length() && str[i] == c){
cnt++;
i++;
}
if(cnt > 1) ans = ans + to_string(cnt);
ans = ans + c;
}
}else{
for(int i = 0; i < str.length(); i++){
string cnt;
int k = 1;
while(isdigit(str[i])){//获取计数值
cnt += str[i++];
}
char t = str[i];
if(!cnt.empty()) k = stoi(cnt);
for(int j = 0; j < k; j++) ans += t;
}
}
cout << ans << endl;
return 0;
}