题目地址:PAT1078.字符串压缩与解压
题目描述:
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba。解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。
易错分析:
1. 在这里空格不是分隔符,千万不要做分割操作!
2. 对于字符的处理,建议用getchar()来挡掉回车,不要用scanf("\n"),这里的\n会忽略所有的空白字符,但是该空白字符仍然在缓冲区内。
程序:
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
int main(int argc, char const *argv[])
{
char ch, Input[10005];
scanf("%c", &ch);
getchar(); // 挡掉回车
gets(Input);
int len = strlen(Input), i = 0;
if (ch == 'C')
{
for (; i < len; i++)
{
int length = 0;
while (Input[i] == Input[i+1])
{ /* 因为最后一个是'\0',不用担心越界 */
i++; // 向后移
length++;
}
if (length >= 1)
printf("%d%c", length+1, Input[i]);
else
printf("%c", Input[i]);
}
}
else if (ch == 'D')
{
char Num[5];
int num = 0;
int idx = 0;
for (; i < len; i++)
{
if (Input[i] >= '0' && Input[i] <= '9') // 如果是数字
Num[idx++] = Input[i];
else
{
if (idx) // 如果前面有数字
{
sscanf(Num, "%d", &num); // 把字符数组转为整形
for (int k = 0; k < num; k++)
printf("%c", Input[i]);
idx = 0; // 清空下标
memset(Num, 0, sizeof(Num)); // 清空数组
}
else
printf("%c", Input[i]);
}
}
}
return 0;
}