一、问题描述
把 abcdefghijklmnopqrs共19个字母组成的序列重复拼接 106次,得到长度为 2014 的串。
接下来删除第 1 个字母(即开头的字母 a),以及第 3 个,第 5 个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请输出该字母。
二、题目要求
考察
字符串的相关函数以及使用 建议用时15~25min
三、问题分析
这一题主要考察对字符串的使用,C++的STL库中提供了很多关于串的函数,下面的总结与提高部分有介绍。
一开始,我直接使用for循环判断是否为素数,删除相应字母,但后来发现,比如你删去第一个元素,当你删去第3个元素是发现,第3个元素已经变成第2了,以此类推第5个元素变成第3个,第7个元素变成第4个......
这不就是删除1~n个元素,直到剩下最后一个吗,找到规律之后就很好办。
四、编码实现
//头文件usingnamespacestd; intmain() { strings1="abcdefghijklmnopqrs";//初始化字符串strings; inti,j,n=106;//拼接106个for(i=0;i<n;i++) { s+=s1; } while(s.size()!=1)//当不是最后一个时,进入循环,否则退出循环 { for(i=0;i<s.size();i++) { s.erase(i,1);//删除元素 } } cout<<s;//输出结果return0; }
五、输出结果
输出结果为:q
六、总结与提高
在C++中,C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能, 编程时加入头文件:
//或者万能头文件#include<bits/stdc++.h>usingnamespacestd;
String函数:
用string定义s类(定义什么都可以,只要把s变成定义的字母就可以调用C++中的函数),具体使用方法为:
函数 | 用法 |
常见操作 | |
s.resize(10) | 设置字符串长度为10 |
string s("ABC") | 构造字符串s的值为ABC |
s.empty() | 判断字符串是否为空 |
s.length()或者s.size() | 求解字符串长度 |
s.begin() | 开始值 |
s.end() | 结尾值 |
查找(查找成功返回元素位置,失败返回-1) | |
s.find('A') | 查找字符A |
s.find("ABC") | 查找字符串ABC |
s.find('A',2) | 从位置2开始查找字符A |
s.find("ABCD",1,2) | 从位置1开始,查找ABCD的前两个字符 |
s.rfind() | 从字符串尾部开始查找 |
插入 | |
s.insert(2,3,'A') | 在下标为2的地方添加三个A |
s.insert(2,"ABC") | 在下标为2的地方添加字符串ABC |
s.insert(2,"ABC",1) | 在下标为2的地方添加ABC中的一个 |
s.insert(2,"ABCD", 2,2) | 在下标为2的地方从字符串ABCD中位置2开始的2个字符 |
s.push_back('A') | 在尾部添加字符A |
输出 | |
s.substr(pos,len) | pos代表输出字符的下标,len代表长度 |
替换 | |
s.replace(2,4,"ABCD") | 从下标2的位置,替换4个字符为 "ABCD" |
删除 | |
s.erase(2) | 删除下标2以后的全部元素 |
s.erase(2,1) | 删除下标为2的一个元素 |
翻转 | |
reverse(s.begin(),s.end()) | 翻转所有字符串,即逆序输出 |
复制 | |
s1=s.substring(2) | 提取字符串s从2到尾部赋值给s1 |
s1=s.substring(2,3) | 提取字符串s从2开始三个字符赋值给s1 |
const char*s1=s.data() | 将string类转为字符串数组 |
s.copy(s1,2,3) | 将s中从第3个位置拷贝2个字符到s1中 |
比较(假设原字符串为ABCD) | |
s.compare("ABCD") | 相等返回0,大于原字符串返回1,小于返回-1 |
清空 | |
s.assign("ABC") | 清空字符串,并置为ABC |
s.assign("ABC",2) | 清空字符串,并置为ABC的前2个字符AB |
s.assign("ABC",2,1) | 清空字符串,并置为ABC的从2开始的1个字符 |
s.assign(5,‘A’) | 清空字符串,并置为5个A |
s.clear() | 清空字符串所有字符 |