探索C嘎嘎的奇妙世界:第十三关---STL(string的练习)

2024-06-18 10:54

本文主要是介绍探索C嘎嘎的奇妙世界:第十三关---STL(string的练习),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.仅仅反转字母

         像上述的题我们应该怎么思考呢?我们常规的解法就是双指针一个从头一个从尾,不是字母就加加或者是减减,脑子里有了一个大概的模型了吗?请看正确解法:

class Solution {
public:string reverseOnlyLetters(string s) {if(s.empty())return s;int n1=0,n2=s.size()-1;while(n1<n2){while(n1<n2&&!isalpha(s[n1]))n1++;while(n1<n2&&!isalpha(s[n2]))n2--;swap(s[n1++],s[n2--]);}return s;}
};

让我们来解析一下这段代码:
1: class Solution :定义了一个解决方案类。
2: reverseOnlyLetters  函数:用于反转字符串中仅字母部分。
3: 首先进行边界检查,如果字符串为空则直接返回空字符串。
4: 然后定义两个指针  n1 (起始指针)和  n2 (结束指针),初始分别指向字符串的开头和结尾。
5: 通过两个嵌套的  while  循环,分别找到第一个指针指向的非字母位置和第二个指针指向的非字母位置,跳过这些非字母字符。
6: 当找到两个指针都指向字母时,进行交换操作,并将两个指针同时移动一位( n1++  和  n2-- )。
7: 这样通过不断交换字母位置,最终实现只反转字母部分的效果,最后返回处理后的字符串。

2.字符串中第一个唯一字符

        像上述的题我们又应该怎么思考呢?,应该很容易想到我们之前学到的一种排序方法---计数排序,那么这道题也有着类似的结构,请看正确解法:

class Solution {
public:int firstUniqChar(string s) {int count[26]={0};for(auto ch:s)count[ch-'a']++;for(int i=0;i<s.size();i++){if(count[s[i]-'a']==1)return i;}return -1;}
};

让我们来解析一下这段代码:
1:  class Solution :定义了解决方案类。
2:  firstUniqChar  函数:目的是找出字符串中第一个不重复的字符的索引。
3: 首先定义了一个大小为 26 的整数数组  count ,用于统计每个字母出现的次数。通过遍历字符串  s ,将字符转换为相对应的索引( ch - 'a' ),然后将该索引对应的计数加 1。
4: 接着再次遍历字符串,对于每个字符,检查其在  count  数组中的计数是否为 1,如果是,则说明该字符是不重复的,立即返回其索引  i 。
5: 如果遍历完整个字符串都没有找到不重复的字符,则返回  -1 。

3.字符串最后一个单词的长度

         在上述问题中,要去找最后一个单词的长度,好像只需要找到最后一个空格的位置即可,那么思路形成,请看正确代码:

#include <iostream>
using namespace std;int main() 
{string line;getline(cin,line);size_t pos=line.rfind(' ');cout<<line.size()-pos-1<<endl;
}

让我们来解析一下这段代码:
1:  string line; :定义了一个字符串变量  line 。
2:  getline(cin, line); :从标准输入(键盘)读取一行文本到  line  中。
3:  size_t pos = line.rfind(' '); :使用  rfind  函数在  line  中查找最后一个空格字符的位置,并将其位置存储在  pos  变量中。
4:  cout << line.size() - pos - 1 << endl; :计算并输出字符串  line  的长度减去最后一个空格位置再减 1 的值,实际上就是输出从最后一个空格到字符串结尾的字符个数,即最后一个单词的长度。

4.验证回文串

         在上述问题中,要去判断一个字符串是否是回文串,很容易想到的方法就是双指针啦,一前一后去走,那么请看示例代码:

class Solution {
public:bool isPalindrome(string s) {for(auto& ch:s){if(ch>='A'&&ch<='Z')ch+=32;}int n1=0,n2=s.size()-1;while(n1<n2){while(n1<n2&&!isalnum(s[n1]))n1++;while(n1<n2&&!isalnum(s[n2]))n2--;if(s[n1]!=s[n2])return false;n1++;n2--;}return true;}
};

让我们来解析一下这段代码:
1:  class Solution :定义了一个名为 Solution 的类。
2:  isPalindrome 函数:这是该类的一个方法,用于判断给定的字符串 s 是否为回文。
3: 首先通过遍历字符串 s ,将其中的大写字母转换为小写字母。
4: 然后定义两个指针 n1 (起始位置)和 n2 (末尾位置)。
5: 通过两个嵌套的 while 循环,分别跳过字符串开头和结尾处的非字母和数字字符。
6: 接着比较对应位置的字符,如果不相等则直接返回 false ,表示不是回文;如果相等则两个指针分别向前和向后移动一位。
7: 如果整个遍历过程中都没有发现不相等的情况,则最后返回 true ,表示是回文。

5.字符串相加

在上述问题中,一般思路:
1. 确定相加顺序:明确是将两个或多个字符串按什么顺序连接起来。
2. 逐个字符处理:从第一个字符串的开头开始,依次取出字符,然后与另一个字符串相应位置的字符进行连接操作。
3. 考虑特殊情况:比如处理字符串可能为空的情况,或者对于一些特殊字符或格式要求进行特殊处理。
4. 构建结果字符串:将每次连接得到的字符逐步添加到结果字符串中,直到完成所有字符串的相加操作。

让我们来解析一下这段代码:
1:  addStrings  函数用于将两个字符串表示的数字进行相加。
2:  n1  和  n2  分别记录两个字符串的当前索引位置,从末尾开始。
3:  val1  和  val2  分别表示从两个字符串当前位置取出的数字值(如果索引有效则取对应字符转换为数字,否则为 0)。
4: 在循环中,只要还有未处理完的数字或者有进位( next  不为 0),就继续进行计算。计算当前两个数字和进位的和  sum  ,并更新进位  next  为和除以 10 的商,然后将和除以 10 的余数转换为字符添加到  str  中。
5: 最后通过  reverse  函数反转  str  得到最终的结果字符串。

6:反转字符串(二)

        在上述问题中,涉及到多次翻转,那么就很容易想到循环了,再结合使用开头和结尾的迭代器,问题就迎刃而解了,那么请看示例代码: 

class Solution {
public:string reverseStr(string s, int k) {int n = s.size();for (int i = 0; i < n; i += 2 * k) {reverse(s.begin() + i, s.begin() + min(i + k, n));}return s;}
};

让我们来解析一下这段代码:
1:  reverseStr  方法接受一个字符串  s  和一个整数  k  。
2:  n  表示字符串  s  的长度。
3: 通过一个循环,从索引  0  开始,每次以步长  2k  前进。
4: 在每次循环中,对从当前索引  i  到  i+k  (如果  i+k  超过字符串长度则到字符串末尾)的子串进行反转操作,使用  reverse  函数。
5: 最后返回反转后的字符串  s  。这个方法的作用是按照每  2k  个字符为一组,前  k  个字符进行反转。

7反转字符串中的单词

        在上述问题中,只要记住这段话中的空格的位置,然后分区间进行反转,问题也就迎刃而解了;那么请看示例代码:

class Solution {
public:string reverseWords(string s) {size_t pos1=0,pos2=0;while(pos2!=s.rfind(' ')){pos2=s.find(' ',pos1);reverse(s.begin()+pos1,s.begin()+pos2);pos1=pos2+1;}reverse(s.begin()+pos2+1,s.end());return s;}
};

让我们来解析一下这段代码:
1:  reverseWords 函数用于反转字符串 s 中的每个单词。
2:  pos1 和 pos2 用于标记单词的起始和结束位置。
3: 通过一个循环,不断寻找空格来确定单词的边界。当 pos2 不等于字符串中最后一个空格的位置时,就对从 pos1 到 pos2 的子串进行反转。然后更新 pos1 为 pos2+1 ,准备寻找下一个单词。
4: 当循环结束后,再对最后一个单词(从 pos2+1 到字符串末尾)进行反转。
5: 最后返回处理后的字符串,此时每个单词都被反转了。

        到此我们只是简单的介绍了一下STL中string的相关习题~,后续我们会一一展开学习的,希望这篇博客能给您带来一些启发和思考!那我们下次再一起探险喽,欢迎在评论区进行讨论~~~

这篇关于探索C嘎嘎的奇妙世界:第十三关---STL(string的练习)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071902

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

RabbitMQ练习(AMQP 0-9-1 Overview)

1、What is AMQP 0-9-1 AMQP 0-9-1(高级消息队列协议)是一种网络协议,它允许遵从该协议的客户端(Publisher或者Consumer)应用程序与遵从该协议的消息中间件代理(Broker,如RabbitMQ)进行通信。 AMQP 0-9-1模型的核心概念包括消息发布者(producers/publisher)、消息(messages)、交换机(exchanges)、

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

MySql 事务练习

事务(transaction) -- 事务 transaction-- 事务是一组操作的集合,是一个不可分割的工作单位,事务会将所有的操作作为一个整体一起向系统提交或撤销请求-- 事务的操作要么同时成功,要么同时失败-- MySql的事务默认是自动提交的,当执行一个DML语句,MySql会立即自动隐式提交事务-- 常见案例:银行转账-- 逻辑:A给B转账1000:1.查询

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

轻松录制每一刻:探索2024年免费高清录屏应用

你不会还在用一些社交工具来录屏吧?现在的市面上有不少免费录屏的软件了。别看如软件是免费的,它的功能比起社交工具的录屏功能来说全面的多。这次我就分享几款我用过的录屏工具。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  这个软件的操作方式非常简单,打开软件之后从界面设计就能看出来这个软件操作的便捷性。界面的设计简单明了基本一打眼你就会轻松驾驭啦

C++ STL 适配器

系列文章目录 模板特例化,偏特化,左右值引用 https://blog.csdn.net/surfaceyan/article/details/126794013 C++ STL 关联容器 https://blog.csdn.net/surfaceyan/article/details/127414434 C++ STL 序列式容器(二) https://blog.csdn.net/surfac