算法题每日一练---第22天:猜字母(String类)

Posted 知心宝贝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题每日一练---第22天:猜字母(String类)相关的知识,希望对你有一定的参考价值。

一、问题描述

把 abcdefghijklmnopqrs共19个字母组成的序列重复拼接 106次,得到长度为 2014 的串。

接下来删除第 1 个字母(即开头的字母 a),以及第 3 个,第 5 个等所有奇数位置的字母。

得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请输出该字母。

二、题目要求

考察

1.字符串的相关函数以及使用
2.建议用时15~25min

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

    三、问题分析

    这一题主要考察对字符串的使用,C++的STL库中提供了很多关于串的函数,下面的总结与提高部分有介绍。

一开始,我直接使用for循环判断是否为素数,删除相应字母,但后来发现,比如你删去第一个元素,当你删去第3个元素是发现,第3个元素已经变成第2了,以此类推第5个元素变成第3个,第7个元素变成第4个......

这不就是删除1~n个元素,直到剩下最后一个吗,找到规律之后就很好办。

四、编码实现

```c++
#include <iostream>
#include<string>//头文件
using namespace std;
int main()

string s1="abcdefghijklmnopqrs";//初始化字符串
string s;
int i,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;//输出结果
return 0;


## 五、输出结果
输出结果为:q

![1.png](https://s4.51cto.com/images/blog/202204/14121303_62579f4f0225082612.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

##  六、总结与提高

在C++中,C++ 标准库提供了 **string** 类类型,支持上述所有的操作,另外还增加了其他更多的功能,
编程时加入头文件:

#include<string>//或者万能头文件#include<bits/stdc++.h>
using namespace std;



### 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()                  | 清空字符串所有字符                   |

以上是关于算法题每日一练---第22天:猜字母(String类)的主要内容,如果未能解决你的问题,请参考以下文章

Python每日一练——第3天:三种猜数字小游戏

算法题每日一练---第12天:算式900

算法题每日一练---第32天:奇怪的分式

算法题每日一练---第52天:位运算求解子集

算法题每日一练---第58天:错误的集合

算法题每日一练---第57天:解码异或后的数组