PAT (Basic Level) Practice (中文)1078 字符串压缩与解压 (20 分) 凌宸1642

题目描述:

文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 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

题目要求:

作者			CHEN, Yue
单位 浙江大学
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

解题思路:

大体上很简单,就是根据输入的字符判断是c还是D,然后进行对应的操作即可

// 压缩操作 pointer 的初值为 0
while(pointer < s.length()){
char temp = s[pointer] ; // 拿到此时的字符
int cnt = 0 ; // 定义cnt记录这个字符的个数 , 也可以从 1 开始
while(pointer < s.length() && temp == s[pointer]){ // 判断当前字符是否与 temp 相等
pointer ++ ; // 指针往后移一位
cnt ++; // 字符的个数自增1
}
// 若果字符的长度比 1 大,意味着可以进行压缩,将长度和 这个字符 均加入 答案向量 ans
if(cnt > 1) ans += to_string(cnt) + temp ;
else ans += temp ; // 长度为 1 不需要压缩,直接加入即可
} // 解压操作
while(pointer < s.length()){
char temp = s[pointer] ;// 拿到此时的字符
int cnt = 0 ; // 记录数字的大小
while(pointer < s.length() && (temp >= '0' && temp <= '9')){ //如果此时的字符是数字类型的
cnt *= 10 ; //原来的数值大小扩大十倍
cnt += (temp - '0') ; // 再加上此时字符表示的数字大小
temp = s[++ pointer] ; // temp 值为下一字符
}
if(cnt == 0) ans += temp ; // 如果 cnt 为 0 代表此时是一个非数字字符,直接加入 ans
else for(int i = cnt ; i > 0 ; i --) ans += temp ; //cnt不为0时 ,往答案中加入 cnt 个字符
pointer ++ ;// 指针后移
}

坑点:

在样例中体现的有:解压的时候,可能碰到连续几个字符都是数字字符的时候,所以需要进行累加求其压缩字符的具体个数。

没有在样例中体现,但是在情理之中的是,既然解压缩的时候需要考虑大于等于10的情况,那么在压缩的时候,也应当考虑需要压缩的字符的个数大于10的时候,在这里我直接利用了 to_string(int val)的函数,直接将数字转为字符串。


完整代码:

#include<bits/stdc++.h>
using namespace std ;
string ans = "" , s ;
char c ;
int main(){
cin>>c;
getchar(); // 吸收首行输入 字符 时后面的 换行符
getline(cin,s);
int pointer = 0 ;
if(c == 'C'){
while(pointer < s.length()){
char temp = s[pointer] ;
int cnt = 0 ;
while(pointer < s.length() && temp == s[pointer]){
pointer ++ ;
cnt ++;
}
if(cnt > 1) ans += to_string(cnt) + temp ;
else ans += temp ;
}
}else{
while(pointer < s.length()){
char temp = s[pointer] ;
int cnt = 0 ;
while(pointer < s.length() && (temp >= '0' && temp <= '9')){
cnt *= 10 ;
cnt += (temp - '0') ;
temp = s[++ pointer] ;
}
if(cnt == 0) ans += temp ;
else for(int i = cnt ; i > 0 ; i --) ans += temp ;
pointer ++ ;
}
}
cout<<ans<<endl;
return 0;
}

PAT (Basic Level) Practice (中文)1078 字符串压缩与解压 (20 分) 凌宸1642的更多相关文章

  1. PAT Basic 1078 字符串压缩与解压 (20 分)

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

  2. 1078 字符串压缩与解压 (20分)C语言

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

  3. PAT 乙级 1078 字符串压缩与解压 (20)

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

  4. PAT(B) 1078 字符串压缩与解压(Java)

    题目链接:1078 字符串压缩与解压 (20 point(s)) 题目描述 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示 ...

  5. PAT 1078 字符串压缩与解压(20)(代码+思路)

    1078 字符串压缩与解压(20 分) 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表 ...

  6. PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642 题目描述: Shuffling is a procedure us ...

  7. PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642 题目描述: To prepare for PAT, the judge someti ...

  8. PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642 题目描述: Given any string of N (≥5) ...

  9. PAT (Advanced Level) Practice 1005 Spell It Right (20 分) 凌宸1642

    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) 凌宸1642 题目描述: Given a non-negative integer N ...

随机推荐

  1. CSP & CORS

    CSP & CORS 内容安全策略 跨域资源共享 CSP https://developers.google.com/web/fundamentals/security/csp google ...

  2. ES2021 & ES12

    ES2021 & ES12 ES2021 new features replaceAll String.prototype.replaceAll const str = `abc,abc`; ...

  3. record terminal sessions

    record terminal sessions asciinema https://asciinema.org/ # install $ brew install asciinema # Start ...

  4. user tracker with ETag

    user tracker with ETag 用户追踪, without cookies clear cache bug 实现原理 HTTP cache hidden iframe 1px image ...

  5. Flutter 1.17.x

    Flutter 1.17.x Flutter (Channel stable, v1.17.3, on Mac OS X 10.15.5 19F101, locale en-CN) https://f ...

  6. Android Webview & iframe auto full screen

    Android Webview & iframe auto full screen android webview iframe 全屏适配 https://stackoverflow.com/ ...

  7. 蓝桥杯——试题 算法训练 Yaroslav and Algorithm

    试题 算法训练 Yaroslav and Algorithm 资源限制 时间限制:100ms 内存限制:128.0MB 问题描述 (这道题的数据和SPJ已完工,尽情来虐吧!) Yaroslav喜欢算法 ...

  8. webpack4.X核心工具库之tapable实例对象Hook

    一.tapable简介 tapable为webpack底层的核心工具库,webpack许多功能的实现都是跟它密不可分的,webpack的编译流程为配置初始化--->内容编译--->输出编译 ...

  9. Java基本概念:内部类

    一.简介 描述: 很多时候我们创建类的对象的时候并不需要使用很多次,每次只使用一次,这个时候我们就可以使用内部类了. 内部类不是在一个java源文件中编写两个平行的类,而是在一个类的内部再定义另外一个 ...

  10. spring boot的 yml和properties的对比

    Spring Boot 虽然做了大量的工作来简化配置,但其配置依然是相当的复杂!支持的外部配置方式就有很多种,笔者没有去统计,也许是为了灵活使用吧.   application.yml 和 appli ...