C++ stringOJ练习题

目录

把字符串转换成整数 

反转字符串

字符串中的第一个唯一字符

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

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

字符串相加

字符串最后一个单词长度

字符串相乘

反转字符串3

反转字符串2

验证回文串


把字符串转换成整数 

 

通过遍历字符串并逐位转换,处理空格、正负号和整数溢出的情况。最终返回转换后的整数。 

class Solution {public:int StrToInt(string str) {const int len = str.length();if (len == 0) return 0;int i = 0;while (i < len && str[i] == ' ') {++i;    // 排除开头的空格}if (i == len) return 0;if (!isdigit(str[i]) && str[i] != '+' && str[i] != '-') return 0;bool neg = str[i] == '-' ? true : false;i = isdigit(str[i]) ? i : i + 1;long long ans = 0L;while (i < len && isdigit(str[i])) {ans = ans * 10 + (str[i++] - '0');if (!neg && ans > INT_MAX) {ans = INT_MAX;break;}if (neg && ans > 1L + INT_MAX) {ans = 1L + INT_MAX;break;}}if (i != len) return 0; return !neg ? static_cast<int>(ans) : static_cast<int>(-ans);}
};
  1. 首先,定义了一个函数 StrToInt,该函数接受一个字符串参数 str,表示要转换的字符串。

  2. 获取字符串的长度,并检查长度是否为0。如果长度为0,则返回0。

  3. 初始化变量 i 为0,用于遍历字符串。

  4. 使用 while 循环跳过字符串开头的空格,将 i 向后移动。

  5. 检查 i 是否已经达到字符串的末尾,如果是,则返回0。

  6. 检查 str[i] 是否为数字、正号或负号。如果不是,则返回0。

  7. 根据 str[i] 的值,确定是否为负数,并将结果存储在布尔变量 neg 中。

  8. 如果 str[i] 不是数字,则将 i 向后移动一位。

  9. 初始化变量 ans 为0,用于存储转换后的整数。

  10. 进入循环,只要 i 小于字符串的长度且 str[i] 是数字,就执行循环体。

  11. 在循环体内,将 ans 乘以10,并加上 str[i] 减去字符 '0' 的结果,以将字符转换为数字。

  12. 检查转换后的整数是否超出了 INT_MAX 的范围。如果超出了,则将 ans 设置为 INT_MAX 或 1L + INT_MAX,具体取决于 neg 的值。

  13. 将 i 向后移动一位。

  14. 循环结束后,检查 i 是否等于字符串的长度。如果不相等,则表示字符串中包含非数字字符,返回0。

  15. 根据 neg 的值,返回转换后的整数,使用 static_cast<int> 进行类型转换。

 

反转字符串

class Solution {
public:void reverseString(vector<char>& s) {reverse(s.begin(),s.end());}
};

字符串中的第一个唯一字符

 

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;}
};

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

 

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

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

 

#include <iostream>
#include <string>
using namespace std;int main() {string a;cin>>a;int charCount[256]={0};for(auto e:a){++charCount[e];}int s=-1;for(auto e:a){if(charCount[e]==1){cout<<e;s=1;break;}}if(s==-1)cout<<s;
}
  1. 首先,定义了一个字符串变量 a,用于接收用户的输入。

  2. 创建一个大小为256的整型数组 charCount,用于记录每个字符在字符串中出现的次数。初始时,所有元素都被初始化为0。

  3. 使用 for 循环遍历字符串 a 中的每个字符。

  4. 在循环中,将当前字符 e 对应的 charCount 数组元素加1,以统计字符出现的次数。

  5. 初始化变量 s 为-1,用于标记是否找到了不重复的字符。

  6. 使用另一个 for 循环遍历字符串 a 中的每个字符。

  7. 在循环中,检查当前字符 e 在 charCount 数组中的值。如果值为1,表示该字符只出现了一次,即为第一个不重复的字符。

  8. 输出该字符,并将变量 s 设置为1,表示已找到不重复字符。

  9. 如果循环结束后 s 仍为-1,表示没有找到不重复的字符。

  10. 输出变量 s 的值,即-1。

 

字符串相加

 

class Solution {
public:string addStrings(string num1, string num2) {int end1=num1.size()-1;int end2=num2.size()-1;int next=0;string str;str.reserve(num1.size()>num2.size()?num1.size()+1:num2.size()+1);while(end1>=0||end2>=0){int val1=end1>=0?num1[end1]-'0':0;int val2=end2>=0?num2[end2]-'0':0;int ret =val1+val2+next;next=ret/10;ret=ret%10;str+='0'+ret;--end1,--end2;}if(next==1)str+='1';reverse(str.begin(),str.end());return str;}
};
  1. 首先,定义了一个函数 addStrings,该函数接受两个字符串参数 num1 和 num2,表示要相加的两个数字。

  2. 初始化变量 end1 和 end2 分别为 num1 和 num2 的最后一个字符的索引。

  3. 初始化变量 next 为0,用于记录进位。

  4. 创建一个空字符串 str,用于存储相加的结果。

  5. 根据两个字符串的长度,预先分配 str 的容量,以避免不必要的内存重新分配。

  6. 进入循环,只要 end1 或 end2 中至少有一个大于等于0,就执行循环体。

  7. 在循环体内,首先获取 num1 和 num2 当前索引位置的字符,并将其转换为对应的数字值。如果已经超出字符串的范围,则将其视为0。

  8. 将 val1val2 和 next 相加,得到 ret,并更新 next 为 ret 除以10的商,更新 ret 为 ret 除以10的余数。

  9. 将 ret 转换为字符,并将其添加到 str 的末尾。

  10. 更新 end1 和 end2,向前移动一位。

  11. 循环结束后,如果 next 为1,说明最高位有进位,将字符 '1' 添加到 str 的末尾。

  12. 将 str 反转,得到正确的相加结果。

  13. 返回 str

 

字符串最后一个单词长度

 

 首先介绍一下接下来会用到的读取字符串的函数getline.

getline 是 C++ 标准库中的一个函数,用于从输入流中读取一行字符串。它有以下几个特点:

  1. 读取一行字符串getline 函数会读取输入流中的一行字符串,直到遇到换行符('\n') 或者文件结束符(EOF)。它将读取的字符串存储到指定的变量中。

  2. 处理空格字符:与 cin 不同,getline 函数会将空格字符(包括空格、制表符等)视为普通字符,而不是作为分隔符。这意味着 getline 可以读取包含空格的字符串,而不会在空格处停止读取。

  3. 保留换行符getline 函数会将换行符('\n') 从输入流中读取并存储在字符串中,即使它是一行的结尾。这与 cin 不同,cin 会将换行符视为分隔符并从输入流中丢弃。

  4. 指定分隔符:除了默认的换行符作为分隔符外,getline 函数还可以接受一个可选的分隔符参数,用于指定其他字符作为行的结束标志。例如,可以使用 getline(cin, str, ',') 来读取以逗号分隔的字符串。

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

字符串相乘

 

 

class Solution {
public:string multiply(string num1, string num2) {if(num1=="0"||num2=="0")return "0";int n1=num1.size(),n2=num2.size();string result(n1+n2,'0');for (int i = n1 - 1; i >= 0; i--) {for (int j = n2 - 1; j >= 0; j--) {int product = (num1[i] - '0') * (num2[j] - '0') + (result[i + j + 1] - '0');result[i + j + 1] = product % 10 + '0';result[i + j] += product / 10;}}size_t startpos = result.find_first_not_of("0");if (string::npos != startpos) {return result.substr(startpos);}return "0";}
};

反转字符串3

 

class Solution {
public:string reverseWords(string s) {int pos=s.find(' ');int start=0;while(pos!=string::npos){reverse(s.begin()+start,s.begin()+pos);start=pos+1;pos=s.find(' ',pos+1); }reverse(s.begin()+start,s.end());return s;}
};

反转字符串2

 

class Solution {
public:string reverseStr(string s, int k) {auto start = s.begin();while (start < s.end()) {if (start + k < s.end()) {reverse(start, start + k);} else {reverse(start, s.end());}start += 2 * k;}return s;}
};

验证回文串

 

class Solution {
public:bool isPalindrome(string s) {string judge;for(char c:s){if(isalnum(c))judge+=tolower(c);}int left=0;int right=judge.size()-1;while(left<right){if(judge[left]!=judge[right]){return false;}++left;--right;}return true;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/224010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

phpy 连接 PHP与Python生态 跨界合作 PHPY搭建 已解决

目录 需求介绍 安装 windows版本 文件地址 运行效果 需求介绍 在日常功能开发中&#xff0c;难免会使用python的计算库&#xff0c;同时自己要是一名PHP开发工程师。就在最近有相应的需求&#xff0c;索性使用phpy来进行功能开发 安装 windows版本 phpy 是识沃团队最新推出…

千梦网创:Too Young,to simple

大多数人啊&#xff0c;还是too young&#xff0c;包括我。 网上的评论对我而言并不影响我通过提供价值服务经营生活&#xff0c;但是有时候对于我的思考还是有一些帮助的。 我把很多可以争与不可争的事件看做是一种现象&#xff0c;这种现象往往可以给予我新的能量。 当学员…

双端队列和优先级队列

文章目录 前言dequedeque底层设计迭代器设计 priority仿函数数组中的第k个最大元素优先级队列模拟实现pushpop调整仿函数存储自定义类型 前言 今天要介绍比较特殊的结构&#xff0c;双端队列。 还有一个适配器&#xff0c;优先级队列。 deque 栈的默认容器用了一个deque的东西…

【C语言(十三)】

自定义类型&#xff1a;结构体 一、结构体类型的声明 1.1、结构体回顾 结构是⼀些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1、结构的声明 例如描述⼀个学生&#xff1a; struct Stu {char name[20];//名字int age;//年龄c…

三层交换,DHCP的详解与VRRP

目录 一、三层交换 1、三层交换机的作用&#xff1a; 2.vlan的虚拟接口vlanif&#xff08;ifinterface接口&#xff09; 3.三层交换机实验 4.拓展实验​编辑 二、DHCP 1.自动获取ip地址&#xff1a; 2.DHCP的好处&#xff1a; 3.分配方式&#xff1a; 4.举例&#xff…

分布式消息传递新时代:深入了解RabbitMQ_sharding插件的精髓【RabbitMQ 八】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 分布式消息传递新时代&#xff1a;深入了解RabbitMQ_sharding插件的精髓 引言前言基础概念以及原理配置和使用应用场景结语 引言 &#x1f33a;&#xff1a;docker构建rabbitmq并配置延迟队列插件 ⏳…

KAKFA实践零碎记录

这里写目录标题 1 内存泄露2 生产者报错 1 内存泄露 错误信息 反复执行&#xff1a;创建消费者->关闭消费者后&#xff0c;内存缓慢上升且GC不能回收内存 错误原因 关闭消费者需要执行KafkaConsumer#close()函数 public void close() {this.close(Duration.ofMillis(30000…

Linux——进程中被打开的文件

C语言中有着许多对文件操作的函数&#xff0c;包括其他语言也有&#xff0c;但是从语言来了解文件有点浅显计算机的一切都离不开操作系统&#xff0c;那么文件跟操作系统也有着密切的关系&#xff0c;所以我们从系统层面来了解文件&#xff08;在进程中打开的文件&#xff09;文…

数据结构之---- 排序算法

数据结构之---- 排序算法 什么是排序算法&#xff1f; 排序算法用于对一组数据按照特定顺序进行排列。 排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更有效地查找、分析和处理。 如图所示&#xff0c;排序算法中的数据类型可以是整数、浮点数、字符或字符串等…

NXP应用随记(四):eMios阅读随记-整体功能概述

目录 1、eMios IP介绍 2、时钟结构 3、通道类型 4、功能介绍 5、中断与DMA 6、EMIOS -通道分配建议(针对S32K312) 1、eMios IP介绍 Emios是什么&#xff1f;eMIOS提供了独立的通道(UCs)&#xff0c;您可以配置这些通道来为不同的功能生成或测量时间事件。 每个eMIOS实例最…

本地项目添加到gitlab命令操作

gitlab上面创建一个跟项目名同名的文件夹 创建文件夹&#xff0c;填写信息 添加readme文档&#xff0c;先保存下创建的文件夹 回到项目&#xff0c;复制项目的git 地址 然后进入到本地项目的文件夹&#xff0c;如d:/workspace/spring-demo&#xff0c;右键打开git bash弹框 命令…

【C语言】二分查找(详解)

&#x1f3a5; 岁月失语唯石能言的个人主页 &#x1f525;个人栏专&#xff1a;秒懂C语言 ⭐若在许我少年时&#xff0c;一两黄金一两风 一、二分查找的思路 二分查找是一种高效的查找算法&#xff0c;尤其适用于有序数组。它的基本思想是通过将查找区间逐步缩小…

Amortized Bootstrapping of LWE:使用 BFV 打包处理

参考文献&#xff1a; [AP13] Alperin-Sheriff J, Peikert C. Practical bootstrapping in quasilinear time[C]//Annual Cryptology Conference. Berlin, Heidelberg: Springer Berlin Heidelberg, 2013: 1-20.[MS18] Micciancio D, Sorrell J. Ring packing and amortized F…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(四)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

【动手学深度学习】(十四)数据增广+微调

文章目录 一、数据增强1.理论知识2.代码 二、微调1.理论知识 一、数据增强 1.理论知识 增加一个已有数据集&#xff0c;使得有更多的多样性 在语言里面加入各种不同的背景噪音改变图片的颜色和形状 使用增强数据训练 翻转 左右翻转上下翻转 不总是可行 切割 从图片中切…

【高效开发工具系列】DataGrip入门

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

文件操作2❤

一&#xff1a;文件的顺序读写 1&#xff1a;顺序读写函数 函数名 功能 适⽤于 fgetc 字符输⼊函数 所有输⼊流 fputc 字符输出函数 所有输出流 fgets ⽂本⾏输⼊函数 所有输⼊流 fputs ⽂本⾏输出函数 所有输出流 fscanf 格式化…

linux系统中出现大量不可中断进程和僵尸进程怎么办?

进程状态 当iowait升高时&#xff0c;进程很可能因为得不到硬件的响应&#xff0c;而长时间处于不可中断的状态&#xff0c;从ps或者top命令的输出中&#xff0c;可以发现它们都处于D状态&#xff0c;也就是不可中断状态。 通过top和ps可以查看进程的状态&#xff0c;S列表示…

Python学习开发mock接口

#1.测试为什么要开发接口&#xff1f; 1)在别的接口没有开发好的时候, mock接口(模拟接口) 2)查看数据, 避免直接操作数据库 #2.开发接口的顺序 1)安装flask flask是一个轻量级开发框架 pip install flask 2)开发一个接口 开发步骤&#xff1a; 1.实例化一个服务server:f…

普冉(PUYA)单片机开发笔记(9): FLASH 读写

概述 单片机的 ROM 容量虽然不大&#xff0c;PY32F003 有 64K 字节的 ROM&#xff0c;但实际应用中会在 MCU 中存储持久化的数据&#xff0c;例如&#xff1a;在物联网应用中&#xff0c;需要把物模型持久化&#xff0c;作为非易失性数据&#xff0c;掉电了也要保存。这就要用…