Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C/C++】涉及string类的经典OJ编程题

【C/C++】涉及string类的经典OJ编程题

作者头像
六点半就起.
发布于 2024-10-16 07:51:43
发布于 2024-10-16 07:51:43
9900
代码可运行
举报
运行总次数:0
代码可运行
【C/C++】涉及string类的经典OJ编程题

一. 把字符串转化成整数(atoi)

点这里:本题LeetCode链接 该题源代码声明: 作者:Krahets 链接:https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/solutions/201301/mian-shi-ti-67-ba-zi-fu-chuan-zhuan-huan-cheng-z-4/ 来源:力扣(LeetCode)

解法一:(不用long)

首先来看该题要用到的所以的变量的定义和初始化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  int res = 0, bndry = INT_MAX / 10;
  int i = 0, sign = 1, length = str.size();

第一步:

  1. 判断字符串是否为空字符串
  2. 读取字符串并丢弃无用的前导空歌并且判断该字符串是否为全为空格的字符串。通过对下标 i 的控制来实现。 代码实现:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 if(length == 0) return 0;
 
 while(str[i] == ' ')
    if(++i == length) return 0;//若不是空字符串,i走到符号位

第二步: 判断字符的正负 代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(str[i] == '-') sign = -1;
if(str[i] == '-' || str[i] == '+') i++;//让i走到符号位后的第一个数字字符

第三步:(关键) (最大最小数值)边界的处理 一旦遇到非数字字符直接返回0;此时的 j 为第一个数字字符。 变量的定义和初始化:int res = 0, bndry = INT_MAX / 10; (INT_MAX )等于2147483647,注意这里的个位数字7;注意初始化的bndry = 214748364; 再看这句代码:res = res * 10 + (str[j] - ‘0’);通过这句代码可以将字符数字转发为对应大小的整形数值。现在就可以理解 if 语句里面的条件判断:

  1. 当res一旦大于bndry = 214748364;往下走完语句res = res * 10 + (str[j] - ‘0’);时,res就会越界;
  2. 当(res == bndry && str[j] > ‘7’),此时下标 j 指向的字符大于7时,往下走完语句res = res * 10 + (str[j] - ‘0’);时,res也会越界;

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 for(int j = i; j < length; j++) {
    if(str[j] < '0' || str[j] > '9') break;
    if(res > bndry || res == bndry && str[j] > '7')
      return sign == 1 ? INT_MAX : INT_MIN;
     res = res * 10 + (str[j] - '0');
  }

完整代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int myAtoi(string str) {
        int res = 0, bndry = INT_MAX / 10;
        int i = 0, sign = 1, length = str.size();
        if(length == 0) return 0;
        while(str[i] == ' ')
            if(++i == length) return 0;
        if(str[i] == '-') sign = -1;
        if(str[i] == '-' || str[i] == '+') i++;
        for(int j = i; j < length; j++) {
            if(str[j] < '0' || str[j] > '9') break;
            if(res > bndry || res == bndry && str[j] > '7')
                return sign == 1 ? INT_MAX : INT_MIN;
            res = res * 10 + (str[j] - '0');
        }
        return sign * res;
    }
};

解法二:(用long)

用long的前提:(操作系统)环境能存储 64 位大小的有符号整数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int myAtoi(string str) {
        long int res = 0, bndry = INT_MAX / 10;
        int i = 0, sign = 1, length = str.size();
        if(length == 0) return 0;
        while(str[i] == ' ')
        {
            i++;
            if(i == length)
            return 0;
        }
        if(str[i] == '-')
        sign = -1;
        if(str[i] == '-' || str[i] == '+') i++;
        for(int j = i; j < length; j++)
        {
            if(str[j] > '9' || str[j] < '0')
            return sign * res;
            res = res * 10 + str[j] - '0';//如果不用long,这句代码可能会造成res溢出int max;无法通过部分测试
            if(res > INT_MAX)
            return sign == 1 ? INT_MAX : INT_MIN;
        }
        return sign * res;
    }
};

二.字符串相加

点这里:本题LeetCode链接

代码实现(含注释):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    string addStrings(string num1, string num2) {
        string tmp;
        int count = 0;//用于进位
        int gap1 = num1.end() - num1.begin() - 1;//字符串1尾下标
        int gap2 = num2.end() - num2.begin() - 1;//字符串2尾下标
        while(gap1 >= 0 || gap2 >= 0)
        {
            int x = gap1 >= 0 ? num1[gap1] - '0' : 0;//将数字字符串转换为对应整形数字
            int y = gap2 >= 0 ? num2[gap2] - '0' : 0;//当下标走到负数将其转换为0
            int sum = x + y + count;//对应两两相加,在加上进位数值
            count = sum / 10;//得进位数值
            sum %= 10;//得个位数值
            tmp += (sum + '0');//依次拼接(逆序)
            gap1--;
            gap2--;
        }
        if(count == 1)//解决一个字符串为“0”,另一个为“9”,还有最高位未进位的情况
        {
            tmp += '1';
        }
        reverse(tmp.begin(), tmp.end());//颠倒为顺序
        return tmp;
    }
};

三.反转字符串

点这里:本题LeetCode链接

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    void reverseString(vector<char>& s) {
        int begin = 0;
        int end = s.size() - 1;
        while(begin < end)
        {
           swap(s[begin], s[end]);
            begin++;
            end--;
        }
    }
};

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

点这里:本题LeetCode链接

解法一:

原理:两两比较字符串中的所以字符,通过计数来判断是否有相同字符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int firstUniqChar(string s) {
        for(int i = 0; i < s.size(); i++)
        {
            int count = 0;
            int j = 0;
            for(; j < s.size(); j++)
            {
                if(s[i] == s[j] && i != j)
                break;
                if(s[i] != s[j])
                count++;
            }
            if(count == s.size() - 1)
            return i;
        }
        return -1;
    }
};

解法二:(推荐)

原理:如果从左往右找,和从右往左找同一个字符,返回它们的下标相同,则在给出的字符串中该字符有且只有这一个 s.find(s[i]) : 返回字符串s中从左向右查找s[i]第一次出现的位置; s.rfind(s[i]) : 返回字符串s中从右向左查找s[i]第一次出现的位置; 解法二声明: 作者:WTY2002 链接:https://leetcode.cn/problems/first-unique-character-in-a-string/solutions/948758/qiao-yong-stringrong-qi-de-cha-zhao-han-y1507/ 来源:力扣(LeetCode)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int firstUniqChar(string s) {
        for(int i = 0; i < s.size() ; i++){
            if(s.find(s[i]) == s.rfind(s[i])){
                return i;
            }
        }
        return -1;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Leetcode】string类刷题
接着,创建两个索引,begin和end,一个从前往后找,找到一个字母停止,另一个从后面找,找到字母停止,然后进行交换,保证begin<end,比较简单,代码如下:
用户11029103
2024/04/20
1360
【Leetcode】string类刷题
STL介绍以及string类
是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
用户11039545
2024/08/20
1730
STL介绍以及string类
【C++】9道经典面试题带你玩转string类
https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/
修修修也
2024/06/17
1370
【C++】9道经典面试题带你玩转string类
【C++】 string类:应用与实践
💥个人主页:大耳朵土土垚的博客 💥 所属专栏:C++入门至进阶 这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖
大耳朵土土垚
2024/05/24
1820
【C++】 string类:应用与实践
【C++】string的9道OJ题
1. 这道题的难度算非常简单的了,我们可以定义两个变量来表示数组首尾位置的有效字符的下标,然后分别从前和从后向中间遍历,只要遇到字母就停下来,利用库函数swap进行交换。
举杯邀明月
2023/04/12
4480
【C++】string的9道OJ题
C++刷题(三):string
将字符串数字转换成对应整型的方法即:用字符数字的ASCII-‘0’,这道题的难点在于,如何判断边界,处理溢出问题。我们必须在计算前就判断是否越界,因为不管是否储存了表达式的结果,如果计算发生越界,则返回的就是溢出后的数据(即数据不是真实的计算结果,无法按照正常逻辑比较数字大小)。
用户11029137
2025/03/19
630
C++刷题(三):string
深入解析字符串刷题技巧:从基础到进阶
字符串是编程中常见且重要的基础数据类型,特别是在刷题过程中,它经常与其他数据结构和算法相结合,成为关键的一环。本篇博客将系统性地探讨字符串相关的典型题目,分享高效的解题思路与技巧,帮助你在刷题时游刃有余。
suye
2025/05/29
1140
深入解析字符串刷题技巧:从基础到进阶
【C/C++】速通涉及string类的经典OJ编程题
六点半就起.
2024/10/16
1020
【C/C++】速通涉及string类的经典OJ编程题
C#版[击败100.00%的提交] - Leetcode 6. Z字形变换 - 题解
Leetcode 6. ZigZag Conversion 在线提交: https://leetcode-cn.com/problems/zigzag-conversion/
Enjoy233
2019/03/05
6540
C#版[击败100.00%的提交] - Leetcode 6. Z字形变换 - 题解
c++ LeetCode (初级字符串篇) 九道算法例题代码详解(二)
原文链接:https://www.cnblogs.com/DOMLX/p/11089327.html
徐飞机
2019/07/01
1.2K0
【C++修行之道】string类练习题
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
走在努力路上的自己
2024/07/13
1660
【C++修行之道】string类练习题
【OJ】string类题目
再定义一个变量用来记录进位int next=0;。重新定义一个string的字符串用来记录相加结果string retstr。 当两个字符相加,得注意,要转换为整形相加,当ret大于10,那么next=ret/10,而字符穿要记录的是ret=ret%10,再头插retstr.insert(0,1,ret+'0'),头插时要转换为字符头插。 如果9+1,那么返回结果就是0,所以不能忘记少插入进位值,在最后判断一下,再进行头插:
zxctscl
2024/03/17
1090
【OJ】string类题目
[C++]string的使用
1.string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数。
IT编程爱好者
2023/05/11
5260
[C++]string的使用
C++版 - Leetcode 8: String to Integer (myAtoi,C库函数atoi模拟) (剑指offer 面试题49) 解题报告
提交网址: https://leetcode.com/problems/string-to-integer-atoi/
Enjoy233
2019/03/05
8480
【C++】string类(附题)
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列 的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户 自己管理,稍不留神可能还会越界访问。
ZLRRLZ
2024/12/13
1430
【C++】string类(附题)
【OJ】string类刷题
题目给的是到2k就翻转前k个,那么循环的时候直接跳到2k处就行for (int i = 0; i < n; i += 2 * k) 。 这里用 reverse翻转的时候区间选择与k有关,以例1为例:发现第一个翻转区间是[0,2),也就从i=0到i+k,得注意区间是左闭右开的;第二个翻转区间是[4,6),也就是i=4到n, reverse的结束就得取i+k和n中小的那一个。将区间写出来就是s.begin() + i, s.begin() + min(i + k, n)。
zxctscl
2024/03/21
820
【OJ】string类刷题
LeetCode 刷题笔记——day 6
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
h-t-m
2022/11/24
3840
LeetCode 刷题笔记——day 6
【每日算法Day 89】手动实现字符串转整数(atoi)函数,你会吗?
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
godweiyang
2020/04/14
4920
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——5.string
hope kc
2024/09/23
950
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——5.string
【LeetCode】8. 字符串转换整数 (atoi)
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
韩旭051
2020/06/23
5630
【LeetCode】8. 字符串转换整数 (atoi)
相关推荐
【Leetcode】string类刷题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档