P1098 [NOIP2007 提高组] 字符串的展开 个人刷题011

P1098 [NOIP2007 提高组] 字符串的展开

P1098 [NOIP2007 提高组] 字符串的展开

题解

本题还是一道模拟题,但是各种条件比较多,很繁琐。我个人的处理思路就是遇到’-'的时候调用expendStr()函数处理,首先计算需要填充的长度,然后填充到tmp中,再根据三个展开条件具体进行。
比较坑的一点是用例很长(刚开始没考虑到最后的长度会那么长,只开了1000位,结果后几个样例都是因为数组越界导致错误的。(不知道为什么提交是wa而不是re))

#include <iostream>
#include <cstdio>
#include <cstring>
int p, q, t;



int expendStr(char str[], int len, char st, char ed)
{
	if (st == ed)
	{
		str[len++] = '-';
		return len;
	}

	if ((st >= '0' && ed >= '0' && st <= '9' && ed <= '9') || (st >= 'a' && st <= 'z' && ed >= 'a' && ed <= 'z'))//数字
	{
		int count = ed - st - 1;
		if (ed - st < 0)
		{
			str[len++] = '-';
			return len;
		}
		char tmp[1000] = { '\0' };
		int tLen = 0;
		//先把需要填充的写入到tmp中
		for (int i = 1; i <= count; i++)
		{
			for (int j = 0; j < q; j++)
			{
				if (p == 3)
					tmp[tLen++] = '*';
				else
					tmp[tLen++] = st + i;

			}
		}

		if (t == 1)
		{
			for (int i = 0; i < tLen; i++)
			{
				str[len++] = tmp[i];
			}
		}
		else
		{
			for (int i = tLen - 1; i >= 0; i--)
			{
				str[len++] = tmp[i];
			}
		}

		if (st >= 'a' && st <= 'z' && ed >= 'a' && ed <= 'z' && p == 2)
		{
			for (int i = len - tLen; i < len; i++)
			{
				str[i] = str[i] - ('a' - 'A');
			}
		}
	}
	else
	{
		str[len++] = '-';
		return len;
	}
	return len;
}




int dealStr(char org[], int len, char ans[])
{
	int aLen = 0;
	for (int i = 0; i < len; i++)
	{
		char ch = org[i];
		if (ch != '-')
		{
			ans[aLen++] = ch;
		}
		else if (ch == '-' && i == 0 || i == len - 1)
		{
			ans[aLen++] = ch;
		}
		else 
		{
			aLen = expendStr(ans, aLen, org[i - 1], org[i + 1]);
		}
	}
	return aLen;
}


int main()
{

	char str[9001] = { 0 };
	char ans[9001] = { 0 };
	int len;
	int ansLen;
	//p = 1 小写填充,p = 2大写填充,p = 3用*填充
	//q 每个字母/数字的填充个数
	//t = 1 顺序填充 t = 2逆序填充
	scanf("%d %d %d", &p, &q, &t);
	scanf("%s", str);
	len = strlen(str);
	ansLen =  dealStr(str, len, ans);
	for (int i = 0; i < ansLen; i++)
	{
		printf("%c", ans[i]);
	}
	printf("\n");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值