寒假填空训练一1010删字母(滚动数组或replace(进行string的删除)),学习一下string的replace以及string的相加

敲黑板:replace是<cstring>内的函数 有很多的用法我就先掌握一下 

            想知道其他的 传送门->   replace 详解

             

replace(size_tpos,size_tlen,const string &str)
	用str替换指定字符串 从起始位置pos开始 长度为len的字符
举例:
 int main()
 {
 	string line="this@ is@ a test string!";
 	line=line.replace(lin.find("@"),1,"");
 	cout<<line<<endl;
  } 
运行结果:
	 this is@ a test string! //第一个@就没了 

          

Problem Description

把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
答案是一个小写字母,不要填写任何多余的内容。

Input

Output

输出一个小写字母 


第一种用replace

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int temp;
	string s="abcdefghijklmnopqrs";
	string ss;
	for(int i=0;i<106;i++)//拼接106次 
		ss+=s;
	while(ss.length()>1)
	{
		for(int i=0;i<ss.length();i++)//在这里需要解释一下为啥是i++ 
		{
// 每次 str删掉一个字符后原先的字符的位置就已经发生了改变 所以i++ 所得到的位置就是未进行删减之前的正确位置		 
			ss.replace(i,1,""); 
		//	cout<<ss.length()<<endl; 从这条语句中发现每次运行过上面一条语句 ss的长度已经发生了改变 
		} 
	} 
	cout<<ss;
	return 0;
}

  第二种我自己想出来的,由于自己不会用STL 中的vector来维护数组,所以我用了两个 数组来表示进行每次删减后的数组   

在这里,我用123456....19来替代 ab... s int数组我感觉比那个 char 还有string 好操作

#include<iostream>
using namespace std;
int a[2015];//要进行删减的数组 
int b[2015];//保存删减之后 然后再把b数组赋值给 a数组 再对a 数组进行操作 
int c[20];
int main()
{
	for(int i=1;i<20;i++)
		c[i]=i;
	int t=0;
	for(int i=1;i<=105;i++)//105的串接  之前就已经有了一次 
	{
		for(int j=1;j<=19;j++)
		{
			t=i*19+j;
			a[t]=c[j];
		}
	}
	int flag=2014;//一开始一共就 2014个 
	while(flag!=1)//当只 剩下一个的时候 是循环退出的条件 
	{
		int k=1;
		for(int i=1;i<=flag;i++)//如果是 奇数的话 就把a[i] 标记成0 否则就存入b[k++]数组中 
		{
			if(i%2==1)
				a[i]=0;	
			else
			   b[k++]=a[i];
		}
		
		for(int i=1;i<k;i++)// 把b 数组赋值到a 数组中 
		{
			cout<<b[i]<<" ";
			a[i]=b[i];
			
		}cout<<endl;
		if(flag%2==0)//对  flag 进行更新, 
		{
			flag/=2;
		}
		else
		{
			flag=(flag+1)/2-1;
		}
	}
	cout<<a[1]<<endl; 
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值