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

这篇具有很好参考价值的文章主要介绍了【C++】---string的OJ题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

(1)题目描述

【C++】---string的OJ题,C++,c++,算法,开发语言

(2)思路展示

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

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

注意:数字的越界处理

【C++】---string的OJ题,C++,c++,算法,开发语言

(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)题目描述

【C++】---string的OJ题,C++,c++,算法,开发语言

(2)思路展示

【C++】---string的OJ题,C++,c++,算法,开发语言

(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)题目描述

【C++】---string的OJ题,C++,c++,算法,开发语言

(2)思路展示

【C++】---string的OJ题,C++,c++,算法,开发语言

(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)题目描述

【C++】---string的OJ题,C++,c++,算法,开发语言

(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)题目描述

【C++】---string的OJ题,C++,c++,算法,开发语言

(2)思路展示

【C++】---string的OJ题,C++,c++,算法,开发语言
更详细的题目解析/细节在代码的注释中。

(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)题目描述

【C++】---string的OJ题,C++,c++,算法,开发语言

(2)思路展示

  1. 这里要特别回顾一下getline()函数!
    【C++】---string的OJ题,C++,c++,算法,开发语言
    第1个参数就是:cin
    第2个参数就是:cin输入内容的变量!
    【C++】---string的OJ题,C++,c++,算法,开发语言

直接利用库里面的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)题目描述

【C++】---string的OJ题,C++,c++,算法,开发语言

(2)思路展示

【C++】---string的OJ题,C++,c++,算法,开发语言
需要进行判断,反转区间的有三种情况:
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)题目描述

【C++】---string的OJ题,C++,c++,算法,开发语言

(2)思路展示

【C++】---string的OJ题,C++,c++,算法,开发语言

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

好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!
【C++】---string的OJ题,C++,c++,算法,开发语言文章来源地址https://www.toymoban.com/news/detail-849576.html

到了这里,关于【C++】---string的OJ题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++:string相关的oj题(415. 字符串相加、125. 验证回文串、541. 反转字符串 II、557. 反转字符串中的单词 III)

    传送门 首先,定义两个指针 index1 和 index2 分别指向两个输入字符串的最后一位,用来从后往前遍历字符串。 然后定义一个变量 next 用来表示进位,初始化为 0。 接下来使用一个循环来遍历两个字符串,直到 index1 和 index2 都小于 0。在循环中,每次取出 index1 和 index2 对应位置

    2024年01月23日
    浏览(59)
  • OJ刷题---[算法课动态规划]走网格(C++完整代码)

    m行n列的网格,从左上角(1,1)出发,每一步只能向下或者向右,问共有多少种方法可以走到右下角(m,n); 输入参数 m n (1=m=10 1=n=10) 输出多少种走法 比如: 输入:2 3 输出:3 输入:5 5 输出:70 完整代码(C++): 结果: 注意:最后调用的时候,是调用sum(m,n),而不是sum(m+1

    2024年02月07日
    浏览(40)
  • 【C++初阶】String在OJ中的使用(一):仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加

    前言: 🎯个人博客:Dream_Chaser 🎈博客专栏:C++ 📚本篇内容:仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加 目录 917.仅仅反转字母  题目描述: 387.字符串中的第一个唯一字符 题目描述: HJ1 字符串最后一个单词的长度

    2024年04月09日
    浏览(108)
  • 湘大 XTU OJ:1406 String Game、1098 素数个数 题解(非常详细)

    1406 String Game Alice和Bob正在玩一个基于字符串的游戏,一开始, Alice和Bob分别拥有一个等长的字符串S1和S2 ,且这两个字符串只包含小写字母。 在每个回合中, Alice和Bob 必须 分别选择自己的字符串的某一个位置并把这个位置上的字母改变为其他小写字母 。 经过P个回合后,他

    2024年02月13日
    浏览(41)
  • HOJ 系统常用功能介绍 OJ部署快速入门 c++ python 编程语言在线自动评测判题 信息奥赛一本通 USACO GESP 洛谷 蓝桥 CSP NOIP 蓝桥等考题库

    技术支持微  makytony   终身更新维护 功能类似洛谷和信息奥赛一本通,支持CSP复赛中的freopen文件输入输出方式提交,模拟真实考试环境,防止出现 本地  AC 比赛  WA  PA TLE  爆零 的惨剧。 组织比赛作业,创建题目、查看用户提交代码、下载评测数据等都没限制。 约  328

    2024年02月07日
    浏览(53)
  • 【C++】vector OJ练习

    这篇文章我们来做几道vector相关的OJ练习,练习一下vector的使用。。 题目链接: link 思路讲解 那这道题我们用 ^ 来搞是不是就非常简单啊。 两个相同的整数异或结果为0;0和任何整数异或结果还是这个数本身。 所以可以怎么搞, 定义一个变量初始值为0,遍历数组,让它和每

    2023年04月26日
    浏览(49)
  • 【C++】vector相关OJ

    ヾ(๑╹◡╹)ノ\\\" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ\\\" 力扣链接 代码展示: 思路 :异或 力扣链接 代码展示: 思路 : (1)规律:头尾都是1,中间第[j]个数等于上一行[j-1]+[j]; (2)通过两次operator,来访问每一个数据。本质上是先访问第i个vector int 对象,然后再

    2024年02月08日
    浏览(32)
  • [开发语言][C++]:递增递减运算符

    递增运算符和递减运算符为对象的+1和-1提供了简洁的书写形式。 自增自减运算符的应用: 这两个运算符除了应用在算术运算,还可应用于迭代器,因为很多迭代器并不支持算术运算。 递增和递减运算符有两种书写形式:前置版本和后置版本。 前置版本 ++i --i :首先将运算

    2024年01月25日
    浏览(52)
  • C++:OJ练习(每日练习系列)

    把字符串转换成整数_牛客题霸_牛客网 示例1 输入: 返回值: 思路一: 第一步: it从str的第一个字符开始遍历,定义一个最后输出的值你,以及判断结果正负的flag; 第二步:第一个为正则忽略,为负将flag改为负值; 第三步: 遍历字符串,遇到非字母直接退出,否则记录下

    2024年02月05日
    浏览(32)
  • C++:OJ练习(每日练习系列)

    415. 字符串相加 - 力扣(LeetCode) 思路一: 第一步: 需要 获取字符串的两个尾节点下标 ; 第二步: 创建用于 记录进位数、获得的字符串的变量 ; 第三步: 只要 有进位或还有数没有加完继续循环 : 利用三目运算:有符号+符号,无符号+0 ; 第四步: 最后将得到的 字符串

    2024年02月05日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包