您的位置:首页 > 其它

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

2018-03-10 16:12 429 查看
敲黑板: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  蓝桥杯 填空题
相关文章推荐