第六次模拟测试-1

题目描述:
东东正在玩字符串游戏,他有一个魔法,能对字符串进行操作,他能把字符串的第 iii 个字符串变成 iii 个。

比如,若字符串为"abc",东东施展魔法把字符串变成了"abbccc"。

但是,改完之后,快递员给东东打电话了,东东拿完快递回来发现自己忘记了原来的字符串,现在只有你能帮东东

输入格式
第一行输出一个整数 n(1≤n≤100)n(1 \le n \le 100)n(1n100),表示这个字符串的长度。

第二行输入东东施展魔法后的字符串。

输出格式
输出东东原来的字符串。
sample:
Sample Input
6
baabbb
Sample Output
bab
Sample Input 2
10
ooopppssss
Sample Output 2
oops
题目分析:
本题陷阱不少,第一次以为是把重复的记录下个数然后减去重复数,结果发现不是那么回事儿,实际上它的变化是原来每个字母都变,实际上变化后字符串中原来字符的位置差就是一个等差序列,1,2,3,4,5。。。。。。当然我们可以用公式实现,但是我老是WA,所以干脆就用手工加法了。

			count++;
			num++;
			sum=sum+count;

然后每次只需要找,看看是字符串的那个位置满足等差序列的前n项和就行了。

		if(i+1==sum)
		{
			a[num]=s[i];
			count++;
			num++;
			sum=sum+count;
		}

最后输出的时候要注意,由于循环的结果,这导致最终的结果长度是num-1,所以在for里面要注意边界,多输出会WA。

	for(int i=1;i<num;i++)
	{
		cout<<a[i];
	}

代码如下:

#include<iostream>
#include<cstring>
using namespace std;
char a[10010];
int main()
{
	int n;
	cin>>n;
	string s;
	cin>>s;
	int num=1;
	int sum=1;
	int count=1;
	for(int i=0;s[i]!='\0';i++)
	{
		if(i+1==sum)
		{
			a[num]=s[i];
			count++;
			num++;
			sum=sum+count;
		}
	}
	for(int i=1;i<num;i++)
	{
		cout<<a[i];
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值