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

本文介绍了一个简单的字符串压缩与解压算法,压缩通过记录连续字符及其出现次数实现,解压则将压缩后的表示还原成原字符串。代码使用C++实现,并特别注意了空格处理和输入缓冲区的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值