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

news2024/12/24 9:33:57

【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=2147483647
        int 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=2147483647
            if(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来赋值给next
            next=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--;
            }
            // 进行到此处所有的字符都符合了题意
            // 不相等就直接false
            if(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 < 2k

    string 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); 错误:库里面的函数一般都是(左闭右开)所以,不用-1
                reverse(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.coloradmin.cn/o/1509863.html

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

相关文章

vim使用命令

1、 复制粘贴 复制一行: yy p vim 1.txt 进入编辑模式&#xff0c;在需要复制的行先按两下y键&#xff0c;再按p就完成复制复制2行&#xff1a; 2yy p 复制n行&#xff1a; nyy p 2、 删除 删除一行: dd删除2行: 2dd删除n行: ndd 3、 撤销 撤销上一步操作&#xff1a;…

【三、接口协议与抓包】使用ApiPost进行接口测试

你好&#xff0c;我是山茶&#xff0c;一个探索AI 测试的程序员。 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相…

前端javascript Promise使用方法详解(非常全面)

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端零基础教学&#xff0c;实战进阶 景天的主页&#xff1a;景天科技苑 文章目录 Promise对象&#xff08;1&#xff09;…

鸿蒙开发:从入门到精通的全方位学习指南

随着华为鸿蒙HarmonyOS生态系统的迅速扩展&#xff0c;越来越多的开发者渴望深入了解并掌握这一前沿技术。本文旨在为鸿蒙开发新手提供一份详尽且实用的学习教程&#xff0c;助您从零开始&#xff0c;逐步迈向鸿蒙开发的巅峰。 一、鸿蒙开发环境搭建 DevEco Studio安装&#x…

12---风扇电路设计

视频链接 风扇硬件电路设计01_哔哩哔哩_bilibili 风扇电路设计 1、风扇简介 电脑风扇又称为散热风扇&#xff0c;一般用于散热。提供给散热器和机箱使用。市面上一般的散热风扇尺寸大小由直径2.5cm到30cm都有&#xff0c;厚度由6mm到76mm都有&#xff0c;而根据不同运作要求…

美摄科技对抗网络数字人解决方案

在数字化浪潮的推动下&#xff0c;企业对于高效、创新且具备高度真实感的数字化解决方案的需求日益迫切。美摄科技凭借其在人工智能和计算机视觉领域的深厚积累&#xff0c;推出了一款全新的对抗网络数字人解决方案&#xff0c;该方案能够为企业构建出表情和动作都极为逼真的数…

ssm+vue的高校课程评价系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的高校课程评价系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

SSL---VPN

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

2024.3.10 C++

提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {char str[20];cout << "please enter the str:";gets(str);int u…

sqli-labs练习

2关 找出数据库名字 从数据库security 中找到表明名: 找到数据库名字: 从表users中找到列: 取出表users用户名和密码:用户名~密码 3关 判断出id是(‘id’)的形式 4关 双引号测试报错,推测是(“id“) 5关 填写id=1没有回显信息(布尔盲注一般适用于页面没有回显字…

connection SQLException, url:jdbc ,errorCode 0, state 08S01

connection SQLException, url: jdbc:mysql://localhost:3306/itcast_health?useUnicodetrue&characterEncodingutf-8, errorCode 0, state 08S01 添加&#xff1a;&useSSLfalse 添加前 添加后&#xff1a; 查询数据库正常

2.1 关系数据结构及形式化定义 数据库概论

目录 2.1.1 关系 关系&#xff1a;概念 1. 域&#xff08;Domain&#xff09; 2.笛卡尔积 元组&#xff08;Tuple&#xff09; 分量&#xff08;Component&#xff09; 基数&#xff08;Cardinal number&#xff09; 3. 关系 候选码&#xff08;Candidate key&#xf…

Docker 快速入门实操教程ER(完结)

Docker 快速入门实操教程&#xff08;完结&#xff09; 如果安装好Docker不知道怎么使用&#xff0c;不理解各个名词的概念&#xff0c;不太了解各个功能的用途&#xff0c;这篇文章应该会对你有帮助。 前置条件&#xff1a;已经安装Docker并且Docker成功启动。 实操内容&…

Leetcode 675 为高尔夫比赛砍树

文章目录 1. 题目描述2. 我的尝试3. 题解1. BFS 1. 题目描述 Leetcode 675 为高尔夫比赛砍树 2. 我的尝试 typedef priority_queue<int, vector<int>, greater<int>> heap;class Solution { public:int m;int n;int bfs(vector<vector<int>>&…

【力扣hot100】刷题笔记Day25

前言 这几天搞工作处理数据真是类似我也&#xff0c;还被老板打电话push压力有点大的&#xff0c;还好搞的差不多了&#xff0c;明天再汇报&#xff0c;赶紧偷闲再刷几道题&#xff08;可恶&#xff0c;被打破连更记录了&#xff09;这几天刷的是动态规划&#xff0c;由于很成…

二分查找刷题(二)

目录 1.搜索插入位置 算法原理 代码编写 2.x 的平方根 算法原理 代码编写 3.山脉数组的峰顶索引 算法原理 1.搜索插入位置 算法原理 判断二段性 可以将区间分于5和大于等于5的两个区间&#xff0c;可以使用二分查找搜索左区间的模板。 代码编写 int searchInsert(vect…

【触想智能】工业触摸显示器在户外使用需要注意哪些问题?

工业显示器是智能制造领域应用比较广泛的电子产品&#xff0c;它广泛应用于工厂产线以及各种配套设备&#xff0c;在很大程度上提升了工厂的生产效率。 工业显示器按触摸方式分&#xff0c;可以分为工业触摸显示器和非触摸工业显示器两种;按使用环境分&#xff0c;又可以分为室…

计算机网络面经八股-什么是 SYN洪泛攻击?如何防范?

SYN洪泛攻击属于 DOS 攻击的一种&#xff0c;它利用 TCP 协议缺陷&#xff0c;通过发送大量的半连接请求&#xff0c;耗费 CPU 和内存资源。 原理&#xff1a; 在三次握手过程中&#xff0c;服务器发送 [SYN/ACK] 包&#xff08;第二个包&#xff09;之后、收到客户端的 [ACK…

Go语言框架路由Controller控制器设计思路gin路由根据控制器目录分层生成路由地址

Controller设计好处 框架设计用controller分请求路由层级&#xff0c;应用从app目录开始对应请求url路由地址&#xff0c;这样设计师方便开发时候通过请求地址层级快速定位接口方法对应的代码位置。 例如api接口请求路径为&#xff1a;​​http://localhost:8110/​​busines…

解码人工智能的幽默:理解其背后的误解与挑战

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…