题目
https://www.patest.cn/contests/pat-b-practise/1078
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 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
解析
首先分两种情况:
一:压缩(输入C)
先读入一个字符,然后看看后面读入的字符是否和先前的字符相等,注意不要用字符串存储全部输入的字符,直接在线处理,每读入一个字符就和str比较,相等,就让计数器加一,如若不等,那么输出字符数量和字符(数量为1的时候不要输出数量),接着计数器重置为1,把新的字符复制给str,进行下一次读取,直到读取的字符为回车,这里又有一个坑:读取到回车的时候不要着急break,因为前面的字符还没有处理,先用同样的方式处理完前面的字符,然后退出循环。
二:解压(输入D)
首先需要使用getchar()接收一个回车= =(一开始死活做不出来就是因为这个)虽然我也不知道为啥上面的不需要getchar(),而下面的需要= =。
如果接收到的是一个数字,那么就把他加到sum中,注意,这个数字很有可能不止一位数,所以还要进行循环读取,直到读入的不是数字字符,期间不断更新sum,接着输出对应的字符;如果不是数字,那么直接输出这个字符~
源码
#include <iostream>
using namespace std;
int main()
{
//freopen("F://input.txt","r",stdin);
char in;
cin >> in;
if ( 'C' == in ) {
int count = 1;
char str;
char ch;
cin >> ch;
str = ch;
// while ( ch = getchar() != '\n' ) {
while ( true ) {
ch = getchar();
if ( '\n' == ch ) {
if ( 1 != count ) cout << count;
cout << str;
break;
}
if ( ch == str )
++count;
else {
if ( 1 != count ) cout << count;
cout << str;
count = 1;
str = ch;
}
}
}
char ch;
//一开始没写这个getchar()一直不对= =
getchar();
if ( 'D' == in ) {
while ( true ) {
ch = getchar();
if ( '\n' == ch ) break;
else if ( '0' <= ch && '9' >= ch ) {
int sum = (int)(ch - '0');
while ( true ) {
ch = getchar();
if ( '0' <= ch && '9' >= ch ) {
sum *= 10;
sum += (int)(ch - '0');
}
else break;
}
for ( int i = 0; i < sum; i++ )
cout << ch;
}
else cout << ch;
}
}
return 0;
}
所以为啥没有满分???