【C++】---string的OJ题

【C++】---string的OJ题

  • 1.字符串转整形数字(重要)
    • (1)题目描述
    • (2)思路展示
    • (3)代码实现
  • 2.字符串相加(重要)
    • (1)题目描述
    • (2)思路展示
    • (3)代码实现
  • 3.翻转字符串
    • (1)题目描述
    • (2)思路展示
    • (3)代码实现
  • 4.找字符串中第一个只出现一次的字符
    • (1)题目描述
    • (2)思路展示
    • (3)代码实现
  • 5.验证一个字符串是否是回文(重要)
    • (1)题目描述
    • (2)思路展示
    • (3)代码实现
  • 6.字符串最后一个单词的长度
    • (1)题目描述
    • (2)思路展示
    • (3)代码实现
  • 7.翻转字符串II:区间部分翻转(重要)
    • (1)题目描述
    • (2)思路展示
    • (3)代码实现
  • 8.翻转字符串III:翻转字符串中的单词(重要)
    • (1)题目描述
    • (2)思路展示
    • (3)代码实现

1.字符串转整形数字(重要)

(1)题目描述

在这里插入图片描述

(2)思路展示

解题思路:
根据题意,有以下四种字符需要考虑:

  1. 首部空格: 删除之即可;
  2. 符号位: 三种情况,即 ‘’+‘’ , ‘‘−’’ , ''无符号" ;新建一个变量(sign)保存符号位,返回前判断正负即可;
  3. 非数字字符: 遇到首个非数字的字符时,应立即返回;
  4. 数字字符:
    字符转数字: “此 数字 的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可;
    数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x,数字结果为 res ,则数字拼接公式为:(1)res=10*res+x;x=ascii©−ascii(′0′)
    在这里插入图片描述

注意:数字的越界处理

在这里插入图片描述

(3)代码实现

class Solution {
public:int myAtoi(string str) {//1.删除首部空格!int i=0;int sign=1;//标志正负号(默认给正)int ret=0, bndry=INT_MAX/10;// bndry:边界。因为最终要计算ret=ret*10+x;所以要/10// INT_MAX=2147483647int len=str.size();if(len==0)//特殊情况1:空字符串{return 0;}//特殊情况2:非空字符串,但是全是空格!while(str[i]==' ')// 因为可能有多个空格,所以写一个while循环!{if(++i==len)return 0;}// 2.判断正负if(str[i]=='-'){sign=-1;}if(str[i]=='+'||str[i]=='-'){i++;}// 3.判断是否为数字字符,若不是直接返回,若是就进行转换(1.越界 2.不越界)!for(int j=i;j<len;j++)//因为此时不知道i的位置在哪里,所以就创一个新的变量j{//(1)非数字字符if(str[j]<'0'||str[j]>'9'){break;}//如果不是数字字符就没有继续进行的必要了!// (2)越界// 注意:这里越界有两种情况:// 1.ret*10前就已经>INT_MAX了(意思ret最大只能==bndry)// 2.ret==bndry若再加上个位数<7没事!但是个位数>7就越界了!//  bndry==214748364// INT_MAX=2147483647if(ret>bndry||(ret==bndry&&str[j]>'7')){return sign==1?INT_MAX:INT_MIN;}// (3)不越界ret=ret*10+(str[j]-'0');}return sign*ret;}
};

2.字符串相加(重要)

(1)题目描述

在这里插入图片描述

(2)思路展示

在这里插入图片描述

(3)代码实现

class Solution 
{
public:string addStrings(string num1, string num2) {//我们定义两个指针 end1 和 end2 分别指向 num1和num2的最后一个字符 int end1=num1.size()-1,end2=num2.size()-1;string retstr;int next=0;// 定义next为进位值!while(end1>=0 || end2>=0){int val1=end1>=0?num1[end1--]-'0':0;int val2=end2>=0?num2[end2--]-'0':0;// 这一步:num1[end1]-'0'是将 字符数字 转化 为具体的实数int ret=val1+val2+next;// 相加后的ret如果>10肯定要进位,所以说我们用/10来赋值给nextnext=ret/10;ret=ret%10;// 用insert进行头插 每次头插都需要挪动后面的数据效率不高,时间复杂度为:O(N^2)//retstr.insert(retstr.begin(),ret+'0');// ret+'0'是将实数转化为字符数字// 所以要想不超出时间限制,我们就用尾插,然后再用库里面的逆置函数就行了retstr+=(ret+'0');}// 防止特殊情况的出现1+9:if(next==1){retstr+='1';}reverse(retstr.begin(),retstr.end());return retstr;}
};

3.翻转字符串

(1)题目描述

在这里插入图片描述

(2)思路展示

在这里插入图片描述

(3)代码实现

class Solution {
public:void reverseString(vector<char>& s) {int n=s.size();int left=0,right=n-1;while(left<right){swap(s[left],s[right]);left++;right--;}}
};

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

(1)题目描述

在这里插入图片描述

(2)思路展示

实际上用了哈希思想的映射,但是用计数排序的思想也能解决。

(3)代码实现

class Solution {
public:int firstUniqChar(string s) {// 统计每个字符出现的次数int count[256] = { 0 };int size = s.size();for (int i = 0; i < size; ++i)count[s[i]] += 1;// 整个程序的核心代码!// 某个字符,出现一次就+1,出现一次就+1// 按照字符次序从前往后找只出现一次的字符for (int i = 0; i < size; ++i)if (1 == count[s[i]])return i;return -1;}
};

5.验证一个字符串是否是回文(重要)

(1)题目描述

在这里插入图片描述

(2)思路展示

在这里插入图片描述
更详细的题目解析/细节在代码的注释中。

(3)代码实现

class Solution 
{
public:bool IsLetterOrNumber(char ch){return (ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9');}bool isPalindrome(string s){// 先大写字母转换成小写(或者小写换成大写,都不影响),再进行判断for(auto& e:s){if(e>='A'&&e<='Z'){e+=32;}}// 定义的下标int begin=0;int end=s.size()-1;while(begin<end){// 跳过所有 非数字 和 字母 的字符while(begin<end&&!IsLetterOrNumber(s[begin])){begin++;}while(begin<end&& !IsLetterOrNumber(s[end])){end--;}// 进行到此处所有的字符都符合了题意// 不相等就直接falseif(s[begin]!=s[end]){return false;}// 相等就++,-- (直到判断结束!)else{begin++;end--;}}return true;}
};

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

(1)题目描述

在这里插入图片描述

(2)思路展示

  1. 这里要特别回顾一下getline()函数!
    在这里插入图片描述
    第1个参数就是:cin
    第2个参数就是:cin输入内容的变量!
    在这里插入图片描述

直接利用库里面的refind()函数!

(3)代码实现

#include <iostream>
using namespace std;
#include<string>int main() 
{string s;getline(cin,s);cout<<s.size()-1-s.rfind(' ');return 0;
}

7.翻转字符串II:区间部分翻转(重要)

(1)题目描述

在这里插入图片描述

(2)思路展示

在这里插入图片描述
需要进行判断,反转区间的有三种情况:
1.size < k
2.size = k
3.k < size < 2k

实在理解不了的话看一下这个视频:B站:代码随想录

(3)代码实现

class Solution  
{
public://1.size < k//2.size = k//3.k < size < 2kstring reverseStr(string s, int k) {for(int i=0;i<s.size();i+=(2*k)){// (1.和2.)只要字符串的长度有k个或者<k,我就直接把前k个给反转了if(i+k<=s.size()){// reverse(s.begin(),s.end()-1);   错误:只是翻转前k个,不是全部翻转// reverse(s.begin(),s.begin()+k);  错误:他这个翻转要跟着i不断的变化往后走!// reverse(s.begin()+i,s.begin()+i+k-1); 错误:库里面的函数一般都是(左闭右开)所以,不用-1reverse(s.begin()+i,s.begin()+i+k);continue;}// 3. 剩余字符少于 k 个,则将剩余字符全部反转。reverse(s.begin() + i, s.begin() + s.size());}return s;}
};

8.翻转字符串III:翻转字符串中的单词(重要)

(1)题目描述

在这里插入图片描述

(2)思路展示

在这里插入图片描述

(3)代码实现

class Solution 
{
public:string reverseWords(string s) {int len=s.size();int i=0;while(i<len){int start=i;//start是:新单词的第一个位置!//(1)第1个while:遍历一个完整的单词!while(i<len&&s[i]!=' '){i++;}//走到此处下标i指向的是一个空格! //(2)开始原地交换!int left=start;int right=i-1;while(left<right){swap(s[left],s[right]);left++;right--;}// 走到此处1个单词已经交换完了while(i<len&&s[i]==' '){i++;}//(3)跳出循环之后,i就指向了下一个单词的起始位置!// 返回上面 start又指向了一个新单词的第一个位置!}return s;}
};

好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!
在这里插入图片描述

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

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

相关文章

如何保护企业云上安全

近日&#xff0c;CrowdStrike发布了《2024年全球威胁报告》&#xff0c;揭示了网络攻击的最新趋势。报告指出&#xff0c;网络攻击生态系统仍在持续增长&#xff0c;CrowdStrike在2023年观察到了34个新的威胁参与者。同时&#xff0c;攻击者正越来越多地瞄准云环境&#xff0c;…

Docker Desktop将镜像存储位置从C盘迁移到其它盘

一、简述 Docker Desktop默认安装在C盘,默认镜像存储位置在 C:\用户\Administrator\AppData\Local\Docker\wsl Docker Desktop 通过WSL2启动,会自动创建2个子系统,分别对应2个 vhdx 硬盘映像文件。 可以命令行执行wsl --list -v 看到 二、迁移步骤 1、在Docker Desktop…

css之常用样式

展示样式一&#xff1a; <div class"showListBox"><div class"List" v-for"(i,index) in sealList" :key"index"> <div class"ListItemCon"><div class"ListItem-titleBox"><img src…

阿里云ACK的应用服务如何暴露公网并挂载域名

背景介绍 针对部署到阿里云ACK集群的应用服务&#xff0c;实际业务场景可能需要我们暴露其中的服务到公网并要求通过域名访问改服务&#xff0c;那具体在阿里云平台上如何实现呢 配置步骤 新建ack集群是后续工作的第一前提由于篇幅有限就不在本文赘述&#xff0c;如下是基本…

Conmi遇到的坑——禅道的PCDN

好家伙&#xff0c;悄悄在后台吃了七十多G流量&#xff0c;我把你当兄弟宣传&#xff0c;你把我当PCDN吸。 还纳闷今天创建个VUE项目怎么提示D盘没空间&#xff0c;明明留了几十G&#xff0c;好家伙&#xff0c;一下子全吸干了。 删了两个&#xff0c;还有一个

6N137SDM光电耦合器中文资料规格书PDF数据手册引脚图图片价格参数芯片概述

产品概述&#xff1a; 6N137M、HCPL2601M、HCPL2611M 单沟道和 HCPL2630M、HCPL2631M 双沟道包含一个 850 nm AlGaAS LED&#xff0c;与带有可调谐输出的极高速集成式光电探测器逻辑门级进行光耦合。此输出具有一个开路集电极&#xff0c;允许有线 OR 输出。耦合参数在 -40C 至…

QT----计算器

目录 1 搭建标准界面2、 逻辑编写2.1 初始化 1 搭建标准界面 按照下图搭设界面 修改样式让这计算器看起来更像一点&#xff0c;同时对按钮分组进行样式编辑&#xff0c;添加字符串name,为number&#xff0c;其他按键为other。之前的文章里出现过好几次不在赘述 修改最大的样式…

git init 执行后发生了什么?

首先在磁盘中创建一个新目录 Git&#xff0c;进入该目录后执行 git init 初始化。这个时候目录下会创建一个隐藏目录 ./git&#xff0c;这个./git 目录叫做 Git 版本库或者仓库 $ git init Initialized empty Git repository in D:/Git/.git/ 在讲解.git 目录内容前&#xff0…

【SpringBoot3】快速启动框架 快速入门 配置文件

文章目录 SpringBoot3介绍一、快速入门二、入门总结1. 为什么依赖不需要写版本&#xff1f;2. 启动器(Starter)是什么3. SpringBootApplication注解包括的效果&#xff1f; 三、SpringBoot3配置文件3.1 统一配置管理概述3.2 属性配置文件使用3.3 YAML配置文件使用3.4 批量配置文…

【Unity】读取Json的三种方法(JsonUtility,LitJson,Newtonsoft)

介绍 在Unity开发过程中&#xff0c;Json是比较常用的一种数据存储文本&#xff0c;尤其是在和第三方交互中&#xff0c;基本都是json格式。 先给出一个Json示例&#xff0c;我们来看看是如何解析的。 {"Player": [{"id": 1001,"name": "…

SSL---VPN

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.SSL-VPN概述 SLL VPN是一种基于HTTPS&#xff08;即支持SSL的HTTP协议&#xff09;的远程安全接入技术。它充分利用了SSL协议提供的基于证书的身份认证、数据加密和消息完整性验证机制&#…

23-Java空对象模式 ( Null Object Pattern )

Java空对象模式 实现范例 在空对象模式&#xff08;Null Object Pattern&#xff09;中&#xff0c;一个空对象取代 NULL 对象实例的检查Null 对象不是检查空值&#xff0c;而是反应一个不做任何动作的关系&#xff0c;这样的 Null 对象也可以在数据不可用的时候提供默认的行为…

maven运行spring boot项目

我用idea想跑一个整合flowable的spring boot项目&#xff0c;但是跑不起来&#xff0c;原因是jdk版本不够高。但是我的idea是2018版本&#xff0c;最高只能支持到jdk11。就想办法不用idea编译、打包、运行项目。因为spring boot是maven项目&#xff0c;所以可以用maven进行打包…

QT文件的读取与插入

实现功能&#xff1a; 1.输入文本到 Line_edit 点击插入&#xff0c;把文本添加到文件末端 2.点击 获取 读取txt文本&#xff0c;将文本内容显示到左边的窗口中 3.双击左边窗口的选项&#xff0c;弹出对话框&#xff0c;跳转到右边 主要介绍一下文件OI的使用 首先用QFile fil…

51单片机基础篇系列-LED灯点亮代码部分

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” #include<reg52.h> //包含单片机内部寄存器 void main() //&#xff08;&#xff09;{P10xfe;//1111 1110while(1); // } 上面是第一个 LED实验 #include<reg52.h>…

51单片机新建工程

文章目录 前言一、keil新建工程&#xff1f;1.新建文件夹 二、使用步骤1.引入库2.读入数据 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 课程需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、keil新…

基于ACM32 MCU的两轮车充电桩方案介绍,有利于打造高效安全的电池管理

随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及&#xff0c;越来越多的人选择了电动车作为代步工具&#xff0c;而两轮电动车的出行半径较短&#xff0c;需要频繁充电&#xff0c;因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决两轮车…

【笔记版】cgroup大摸底

云端&#xff1a; subsystem实际上就是cgroups的资源控制系统。 blkio&#xff1a; 这个subsystem可以为块设备设定输入/输出限制&#xff0c;比如物理驱动设备&#xff08;包括磁盘、固态硬盘、USB等&#xff09;。cpu&#xff1a; 这个subsystem使用调度程序控制task对CPU的…

力扣大厂热门面试算法题 12-14

12. 整数转罗马数字&#xff0c;13. 罗马数字转整数&#xff0c;14. 最长公共前缀&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.11 可通过leetcode所有测试用例。 目录 12. 整数转罗马数字 解题思路 完整代码 Java Pytho…

STM32 学习11 独立看门狗与窗口看门狗

STM32 学习11 独立看门狗与窗口看门狗 一、**看门狗概述**二、**STM32中的看门狗类型**1. 独立看门狗&#xff08;IWDG&#xff09;&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;独立看门狗框图&#xff08;3&#xff09;独立看门狗配置步骤&#xff08;4&#…