当前位置: 首页 > news >正文

【C++】 string类:应用与实践

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述

💥个人主页:大耳朵土土垚的博客
💥 所属专栏:C++入门至进阶
这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖

💥本篇博客将使用string类求解五个题目,包括题目链接,解题思路以及实现代码,题目中有关函数的理解和使用,也会挑出一些来介绍🥳🥳

目录

  • 💞💞 前言
    • ☑️找出字符串中第一个只出现一次的字符
    • ☑️字符串里面最后一个单词的长度
    • ☑️翻转字符串
    • ☑️字符串相加
    • ☑️字符串转整形数字
    • 结语

☑️找出字符串中第一个只出现一次的字符

✨✨题目链接点击跳转
在这里插入图片描述
解题思路

这里可以参考我们之前学习过的计数排序:
①先定义一个int数组,大小为26*sizeof(int),用来一一对应26个字母(小写),记录每个字母出现的次数;
②然后遍历题目中的字符串s,计算出每个字母的个数存放在之前定义的数组中;
③最后再通过遍历原字符串s找出第一次只出现一次的字符。

代码如下:

#include <iostream>
using namespace std;
#include<string>
int main()
{string s;   //原字符串cin>>s;int count[26] = {0} ; //开辟一个数组计数for(auto ch : s) //范围for遍历{count[ch-'a']++; //计数}for(auto ch : s)    //再次遍历找到第一个出现一次的字符{if(count[ch-'a'] == 1){cout<<ch;   //找到了打印该字符return 0;}}cout<<-1;   //没找到输出-1return 0;
}

这里遍历string类可以参考【C++】学习string类:字符操作的艺术这篇文章讲述的三种方法;

结果如下:
在这里插入图片描述

☑️字符串里面最后一个单词的长度

✨✨题目链接点击跳转
在这里插入图片描述
解题思路

①使用getline函数(后文有解析)获取一行字符串;
②使用rfind函数(使用方法在后文)从字符串末尾往前找到第一个空格,返回该空格的位置;
③使用size函数得到整个字符串长度,减去之前空格的位置再-1,得出最后一个单词的长度。

#include <iostream>
using namespace std;
#include<string>
int main()
{string s;getline(cin,s);   //获取一行字符串int pos = s.rfind(' ');//从后往前遍历找到空格的位置int length = s.size() - pos-1; //计算最后一个单词长度cout<<length;  //打印长度
}

结果如下:
在这里插入图片描述

🥳🥳getline使用方法

  • getline是C++中用于从输入流中读取一行文本的函数。它通常与std::cin结合使用。

示例如下:

#include <iostream>
#include <string>int main() {std::string line;std::cout << "请输入一行文本:";std::getline(std::cin, line);std::cout << "你输入的内容是:" << line << std::endl;return 0;
}

在上面的代码中,std::getline(std::cin, line)将从标准输入流(std::cin)中读取一行文本,并将其存储到名为line的字符串变量中。然后,我们可以使用std::cout打印出用户输入的内容。

  • getline函数还可以接受可选的第三个参数delim,用于指定行分隔符。默认情况下,行分隔符为换行符(\n)。可以将其修改为其他字符,如:
std::getline(std::cin, line, ';');

这将使用分号作为行分隔符

🥳🥳rfind函数使用方法:

  • rfind是C++中的字符串成员函数,用于从字符串的末尾开始查找指定的子字符串,返回最后一次出现的位置。如果未找到子字符串,则返回std::string::npos。

示例如下:

#include <iostream>
#include <string>int main() {std::string str = "Hello world, hello C++";std::size_t found = str.rfind("hello");if (found != std::string::npos) {std::cout << "子字符串在位置 " << found << " 处找到了" << std::endl;} else {std::cout << "未找到子字符串" << std::endl;}return 0;
}

结果如下:
在这里插入图片描述

在上面的代码中,rfind函数从字符串的末尾开始搜索子字符串hello。如果找到了,则返回子字符串的起始位置。如果未找到,则返回std::string::npos。

  • rfind函数还可以接受第二个参数pos,用于指定搜索的起始位置。可以通过调整起始位置来实现在字符串的特定部分进行查找。
    示例如下:
std::size_t found = str.rfind("hello", 10);

这将从字符串的前10个字符开始向后搜索子字符串hello。

  • 需要注意的是,rfind函数返回的位置是从字符串的起始位置(下标为0)开始计算的。

☑️翻转字符串

✨✨题目链接点击跳转
在这里插入图片描述
解题思路

使用左右指针法:
①定义左右下标,当left < right时,交换它们对应的内容;
②直到left >= right 反转完成。

代码如下:

class Solution {
public:void reverseString(vector<char>& s) {//定义左右下标int left = 0;int right = s.size()-1;char tmp = '0';while(left < right)	//左右交换{tmp = s[right];s[right] = s[left];s[left] = tmp;left++;right--;}}
};

结果如下:
在这里插入图片描述

☑️字符串相加

✨✨题目链接点击跳转
在这里插入图片描述
解题思路

采用从后往前遍历两个数组,依次相加的方法,注意要进位:
①定义两个整型分别初始化为两个字符串最后一个字符下标;
②根据下标依次相加,定义整型flag记录进位,如果相加的和大于10,flag就标为1;
④将相加后的和存放在string类中(注意这里直接尾插即可,后面我们再翻转字符串);

代码如下:

class Solution {
public:string addStrings(string num1, string num2) {string num;	//用来存放相加后的字符//定义两个整型分别初始化为两个字符串最后一个字符下标;int end1 = num1.size() -1;int end2 = num2.size() -1;int n = 0;int flag = 0;//记录进位while(end1>=0 || end2 >=0){int n1 = end1 >= 0 ? num1[end1]-'0' :0;	//这里如果end1小于0,那么就将n1赋值为0;end1>=0,说明字符串num1中还有值没加,就将n1赋值为num1[end1] - '0'int n2 = end2 >= 0 ? num2[end2]-'0' :0;	//同上n = n1+n2;	//两数相加if(flag == 1)	//如果有进位,则n++;{n++;}num+=(n%10+'0');	//将和n转成字符存放到num中if(n >= 10){flag = 1;//表示要进一位}else{flag = 0;}end1--;end2--;}//最后如果还存在进位,就需要再+1if(flag == 1){num+='1';}//逆置reverse(num.begin(),num.end());return num;}};

这里有几个关键点:
①当end1<0时,end2>=0;也就是出现一个string中的字符加完了,另一个还剩,这时我们就可以借助三目运算符 int n1 = end1 >= 0 ? num1[end1]-'0' :0;将n1赋值为0,继续和n2相加即可,直到end2<0;
②当全部加完后,还要检查一下进位flag是否为1,如果为1,那么num还需要+1
例如:num1 = “11” , num2 = “999” 时,就需要再+1;
③最后不要忘了反转字符串,如果使用头插就不需要反转字符串,但是头插时间复杂度为O(n^2),效率太低。

结果如下:
在这里插入图片描述

☑️字符串转整形数字

✨✨题目链接点击跳转
在这里插入图片描述
解题思路

这里要注意看懂题目:
①前导如果有字符那么除了‘±’就是空格,一旦有空格后面一定是连续的空格,所以我们要使用while循环跳过前面的空格直到出现‘±’或者数字;
②还需要通过跳过前导空格后第一个字符是否为-,来判断正负,我们可以使用bool类型sign来判断;
③如果跳过前导空格后第一个字符为‘+/-’,就跳过第一个(下标i++)从第二个字符开始求和;如果是数字则直接从跳过空格后的第一个字符开始求和;
④我们还需要通过一些方法验证计算结果是否溢出int范围的数据,超过了就直接返回最值,但是这里要根据之前判断的符号位来决定返回的是INT_MAX还是INT_MIN;
⑤一旦出现了数字,如果之后又出现了字符则直接返回之前求的值即可,后面的如果还有数字就不用管了;

代码如下:

class Solution {
public:int myAtoi(string str) {bool sign = true;   //默认为正数// 跳过开头可能存在的空格int i = 0;while(i < str.size() && str[i] == ' ') {i++;}//接着判断首个字符是否为正负号if(str[i] == '-') {sign = false;  // 该字符串为负数,移至下一个字符接着判断i++;          }else if(str[i] == '+')  // 字符串为正数,sign已经默认为true,直接移动到下一位即可i++;   //下面开始对非正负符号位进行判断if(str[i] < '0' || str[i] > '9') // 正常数字第一位必须为0~9之间的数字,否则就是非法数字return 0;  int res = 0;   //这里res用的int型,需要更加仔细考虑边界情况,但如果用long的话可以省去一些麻烦int num = 0; 	//求和int border = INT_MAX / 10;  // 用来验证计算结果是否溢出int范围的数据while(i < str.size()){// 遇到非数字字符,则返回已经计算的res结果if(str[i] < '0' || str[i] > '9') break;// 注意这句话要放在字符转换前,因为需要验证的位数比实际值的位数要少一位, 这里比较巧妙的地方在于// 1. 用低于int型数据长度一位的数据border判断了超过int型数据长度的值 // 2. 将超过最大值和低于最小值的情况都包括了if(res > border || res == border && str[i] > '7')  return sign == true ? INT_MAX : INT_MIN;//开始对数字字符进行转换num = str[i] - '0';res = res * 10 + num;i++;}//最后结果根据符号添加正负号return sign == true ? res : -res;}
};

结果如下:
在这里插入图片描述
🥳🥳这里还提供一种思路:

我们可以先将字符串str中的有效数字及开始的符号位存放在另外一个字符串num中,然后直接将字符串中的字符转换为整型即可;

代码如下:

int myAtoi(string str) {string num;// 如果空字符串,直接返回0if (str.size() == 0){return 0;}int flag = 0; // 记录正负int count = 0;	//利用count来判断是否数字中间有别的符号,有的话就直接break;for (int i = 0; i < str.size(); i++)//遍历字符串{while (str[i] == ' ')//跳过前导空格{i++;}if (count > 1){break;}if (str[i] == '-' || str[i] == '+')//记录符号位{count++;num += str[i];}else if(str[i] >= '0' && str[i] <= '9'){count = 1;num += str[i];}else{count++;}}}

将num里面的字符转换为整型求和这里没写,大家感兴趣可以自己试试

结语

以上就是今天的所有内容啦,通过题目的练习相信大家对于string类的理解和使用又提高了一个层次 ~ 完结撒花~🥳🎉🎉

相关文章:

【C++】 string类:应用与实践

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…...

巩固学习7

正则表达式 就是用来找到符合模式的字符串&#xff0c;这些模式包括&#xff1a;是什么字符&#xff0c;重复多少次&#xff0c;在什么位置&#xff0c;有哪些额外的约束 找某个字符串 import re text身高:178 体重:168 学号:123456 密码:9527 #在Python中&#xff0c;r前缀用…...

Android 右键 new AIDL 无法选择

提示 (AIDL File)Requires setting the buildFeatures.aidl to true in the build file&#xff09; 解决方式&#xff1a; 在app的build.gradl中 adnroid{} 添加&#xff1a; buildFeatures{aidl true}...

使用Springboot整合Elasticsearch

全文搜索引擎 全文搜索引擎是目前广泛应用的主流搜索引擎&#xff0c;也称为全文检索。它的工作原理是计算机索引程序通过扫描文章中的每一个词&#xff0c;对每一个词建立一个索引&#xff0c;指明该词在文章中出现的次数和位置&#xff0c;当用户查询时&#xff0c;检索程序…...

Vue3+Element+TS动态菜单+按钮权限控制实现探索

1.动态获取权限并根据获取权限转换成相对应的router 根据请求获取菜单数据&#xff0c;对菜单数据进行转换&#xff0c;分别进行下面几步&#xff1a; /*** 组件地址前加斜杠处理*/ export function addSlashToRouteComponent(routeList: AppRouteRecordRaw[]) {routeList.fo…...

五款公司源代码加密软件推荐|代码防泄密解决方案

在当今数字化的世界中&#xff0c;源代码的泄露无疑是一场灾难。对于依赖加密软件保护关键信息的企业和个人来说&#xff0c;这种泄露不仅可能导致数据失窃&#xff0c;还可能损害企业的声誉和客户的信任。面对这种严峻的形势&#xff0c;我们迫切需要一种全面而有效的加密软件…...

【spring】Security 密码加密算法

Spring Security 提供了多种密码加密算法&#xff0c;用于在存储用户密码时进行加密&#xff0c;以增强安全性。 查看org.springframework.security.crypto.factory.PasswordEncoderFactories 以下是一些常用的密码加密算法&#xff1a; BCryptPasswordEncoder&#xff1a; 这…...

IO系列(一) -一文带你读懂 java 中的IO流!

一、摘要 说到 IO&#xff0c;相信大家都不陌生&#xff0c;英文全称&#xff1a;Input/Output&#xff0c;即输入/输出&#xff0c;通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。 比如我们常用的SD卡、U盘、移动硬盘等等存储文件的硬件设备&#xff…...

代码随想录算法训练营第六天| 242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

哈希表理论基础 [LeetCode] 242. 有效的字母异位词 [LeetCode] 242. 有效的字母异位词 文章解释 [LeetCode] 242. 有效的字母异位词 视频解释 题目: 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出…...

【python】中的可迭代对象、迭代器、生成器

结论 凡是实现了__iter__() 方法的类都称之为可迭代对象&#xff0c;但 __iter__() 方法的返回值只能是迭代器和生成器for 循环的本质是先调用 __iter__() 方法&#xff0c;然后不断调用返回值的 __next__() 方法&#xff0c;直至报出异常 StopIteration&#xff0c;可迭代对象…...

短视频矩阵系统源码/saas--总后台端、商户端、代理端、源头开发

短视频矩阵系统源码/saas--总后台端、商户端、代理端、源头开发 搭建短视频矩阵系统源码的交付步骤可以概括为以下几个关键环节&#xff1a; 1. **系统需求分析**&#xff1a;明确系统需要支持的功能&#xff0c;如短视频的上传、存储、播放、分享、评论、点赞等。 2. **技术选…...

K8s:二进制安装k8s(单台master)

目录 一、安装k8s 1、拓扑图 2、系统初始化配置 2.1关闭防火墙selinx以及swap 2.2设置主机名 2.3在每台主机中添加hosts&#xff0c;做映射 2.4调整内核参数&#xff0c;将桥接的ipv4流量传递到iptables&#xff0c;关闭ipv6 2.4时间同步 3、部署docker引擎&#xff0…...

C++类和对象下——实现日期类

前言 在学习了类和对象的六大成员函数后&#xff0c;为了巩固我们学习的知识可以手写一个日期类来帮助我们理解类和对象&#xff0c;加深对于其的了解。 默认函数 构造函数 既然是写类和对象&#xff0c;我们首先就要定义一个类&#xff0c;然后根据实际需要来加入类的数据与函…...

252 基于MATLAB的自适应差分阈值法检测心电信号的QRS波

基于MATLAB的自适应差分阈值法检测心电信号的QRS波&#xff0c;QRS波群反映左、右心室除极电位和时间的变化&#xff0c;第一个向下的波为Q波&#xff0c;向上的波为R波&#xff0c;接着向下的波是S波。通过GUI进行数据处理&#xff0c;展示心率和QRS。程序已调通&#xff0c;可…...

SSIM(Structural Similarity),结构相似性及MATLAB实现

参考文献 Wang, Zhou; Bovik, A.C.; Sheikh, H.R.; Simoncelli, E.P. (2004-04-01). “Image quality assessment: from error visibility to structural similarity”. IEEE Transactions on Image Processing. 13 (4): 600–612. Bibcode:2004ITIP…13…600W. CiteSeerX 10.…...

第十六章-消费者-PUSH方式(一)

16.1 准备阶段 先从一段官方示例代码开始 public class Consumer {public static void main(String[] args) throws InterruptedException, MQClientException {// 初始化consumer&#xff0c;并设置consumer group nameDefaultMQPushConsumer consumer new DefaultMQPushCo…...

【C++要哮着学】初识C++,什么是C++?什么是命名空间?什么又是缺省函数?

文章目录 前言1、C简介1.1、什么是C1.2、C起源1.3、C发展 2、C关键字&#xff08;C98&#xff09;3、命名空间3.1、命名空间的定义及使用3.2、命名空间的嵌套3.3、命名空间的三种使用方式3.3.1、加命名空间名称及作用域限定符3.3.2、使用using将命名空间中某个成员引入3.3.3、使…...

Lua 数字格式化

在编程中&#xff0c;对数字进行格式化是一项常见的任务&#xff0c;特别是当我们需要在用户界面中显示数据或生成报告时。在 Lua 中&#xff0c;我们可以使用一些简单而有效的函数来实现数字的格式化。在本文中&#xff0c;我们将介绍一个由几个函数组成的小型 Lua 库&#xf…...

Java入门基础学习笔记13——数据类型

数据类型的分类&#xff1a; 基本数据类型 引用数据类型 基本数据类型&#xff1a;4大类8种类型&#xff1a; 定义整形用int&#xff0c;再大的数用long。 package cn.ensource.variable;public class VariableDemo2 {public static void main(String[] args) {//目标&#x…...

使用Docker+Jar方式部署微服务工程(前后端分离)看着一篇就够了

本篇教程的使用到的技术有springboot、springcloud、Nacos、Docker、Nginx部署前后端分离访问的微服务。 部署一下Nacos 首先我们需要在服务器中&#xff08;或者本地部署启动一下Nacos&#xff09;&#xff0c;这里我采用服务器的方式进行部署&#xff0c;这里有一点不一样的…...

红外遥控和LCD1602

26.1.1 红外线简介 人的眼睛能看到的可见光按波长从长到短排列&#xff0c;依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为 0.62&#xff5e;0.76μm&#xff1b;紫光的波长范围为 0.38&#xff5e;0.46μm。比紫光波长还短的光叫紫外线&#xff0c;比红光波长还长的…...

房屋出租管理系统需求分析及功能介绍

房屋租赁管理系统适用于写字楼、办公楼、厂区、园区、商城、公寓等商办商业不动产的租赁管理及租赁营销&#xff1b;提供资产管理&#xff0c;合同管理&#xff0c;租赁管理&#xff0c; 物业管理&#xff0c;门禁管理等一体化的运营管理平台&#xff0c;提高项目方管理运营效率…...

高精度模拟算法

高精度模拟算法 高精度加法 extern string m,n; extern int a[MAX],b[MAX],ans[MAX]; void addition(){int _mmax(m.size(),n.size());reverse(m.begin(),m.end()),reverse(n.begin(),n.end());//转置原字符串for(int i0;i<m.size();i) a[i]m[i]-0;//字符型以ASCII码存储&…...

Ansible简介版

目录 架构 环境部署 一、Ansible安装部署 1.yum安装Ansible 2.修改主机清单文件 3.配置密钥对验证 4.ansible-doc 5.看被控主机 二、常用模块 1.Command模块 2.Shell模块 3.Cron模块 1.添加 2.删除 4.User模块 5.Group模块 1.创建组 ​编辑 ​编辑 ​编辑…...

卷积通用模型的剪枝、蒸馏---蒸馏篇--RKD关系蒸馏(以deeplabv3+为例)

本文使用RKD实现对deeplabv3+模型的蒸馏;与上一篇KD蒸馏的方法有所不同,RKD是对展平层的特征做蒸馏,蒸馏的loss分为二阶的距离损失Distance-wise Loss和三阶的角度损失Angle-wise Loss。 完整代码放在文末。 一、RKD简介 RKD算法的核心是以教师模型的多个输出为结构单元,取…...

AVL树的完全指南:平衡与性能

文章目录 AVL树简介AVL的操作建立一个AVL树插入操作删除操作 书写代码1.构造函数和析构函数2.获取最大值和最小值3.树的高度和节点个数3.前序中序和后序遍历4.判断树是否为空树5.四个旋转操作6.获取平衡因子7.插入操作8.删除操作9.搜索节点.h文件中的定义 总结 AVL树简介 AVL树…...

itext7 PDF添加水印,获取页面高度,添加到页面右上角

ps: pdf添加水印&#xff0c;内容多的时候会往下跑&#xff0c;修改为获取当前页面高度&#xff0c;进行固定在顶部&#xff0c;其他需要可以自己进行调整&#xff0c;直接贴代码。 public static void main(String[] args) throws IOException {String localFilePath "…...

docker端口映射成功,docker端口不生效的问题解决,外界无法访问docker映射端口

docker端口映射不生效的问题解决 问题 使用docker run -p 88848:8848后&#xff0c;显示容器启动正常&#xff0c;并且使用docker logs –f xxx能够看到容器可以正常启用&#xff0c;docker ps 可以看到容器启动成功&#xff0c;并且端口已经映射,但是在浏览器访问相关地址&am…...

RSA非对称加密解密,前端公钥加密后端私钥解密

RSA非对称加密解密&#xff0c;前端公钥加密后端私钥解密&#xff0c;可以防止陌生人直接通过后端接口篡改数据。有数据泄露的风险。 前端&#xff1a;Vue框架 后端&#xff1a;sprintboot&#xff08;Java&#xff09; 工具类&#xff1a;hutool 前端Vue获取公钥&#xff1a…...

Nginx-01-Nginx 是什么? 能做什么?

nginx 系列 Nginx-01-聊一聊 nginx Nginx-01-Nginx 是什么 Nginx-02-为什么使用 Nginx Nginx-02-Nginx Ubuntu 安装 windows10 WSL ubuntu 安装 nginx 实战笔记 Nginx-02-基本使用 Nginx-03-Nginx 项目架构 Nginx-04-Docker Nginx Nginx-05-nginx 反向代理是什么&…...