首页 > 编程语言 >【C/C++】涉及string类的经典OJ编程题

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

时间:2024-09-18 10:54:16浏览次数:3  
标签:return OJ int res C++ ++ str 字符串 string

【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)

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

  int res = 0, bndry = INT_MAX / 10;
  int i = 0, sign = 1, length = str.size();

第一步:

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

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

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也会越界;

代码实现:

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

完整代码:

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 位大小的有符号整数

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链接
在这里插入图片描述

代码实现(含注释):

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链接
在这里插入图片描述

代码实现:

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链接
在这里插入图片描述

解法一:

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

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)


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

标签:return,OJ,int,res,C++,++,str,字符串,string
From: https://blog.csdn.net/2303_80737493/article/details/142315099

相关文章

  • 用C++编写一个桌面日历程序
    前言在这篇博文中,我们将一起编写一个简单的桌面日历程序。我们的目标是创建一个可以显示当月日历的应用程序,并允许用户进行简单的导航,如查看上个月和下个月。这个程序将使用C++和一些基础的图形用户界面(GUI)库。工具和库为了实现这个任务,我们将使用以下工具和库:C++编译器:例如,GCC或者......
  • 【C++ Primer Plus习题】16.6
    大家好,这里是国中之林!❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←问题:解答:main.cpp#include<iostream>#include<cstdlib>#include<ctime>#include<queue>usingn......
  • 【C++ Primer Plus习题】16.5
    大家好,这里是国中之林!❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←问题:解答:#include<iostream>#include<list>usingnamespacestd;template<typenameT>intreduce(T......
  • General error: 1366 Incorrect string value: '\xF0\x9F\x98' for column 'conten
    错误信息 Generalerror:1366Incorrectstringvalue:'\xF0\x9F\x98'forcolumn'content' 表明插入的数据包含不正确的字符或编码问题。具体原因可能是:字符集不匹配:数据库表的字符集与应用中使用的字符集不一致。字段类型不支持某些字符:VARCHAR 或 TEXT 类型字段可能......
  • 【25.2】C++智能交友系统
    Girl类代码补充对一些成员函数定义的修改.h文件#pragmaonce#include<string>#include<sstream>usingnamespacestd;classBoy;classGirl{public: Girl(); Girl(intage,stringname,intstyle); ~Girl(); intgetAge()const; stringgetName()const......
  • SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F...' for
    错误信息 SQLSTATE[HY000]:Generalerror:1366Incorrectstringvalue:'\xF0\x9F...'forcolumn'content'atrow1 表明插入的数据包含不正确的字符或编码问题。具体原因可能包括:字符集不匹配:数据库表的字符集与应用中使用的字符集不一致。字段类型不支持某些字符:VARC......
  • [C/C++]图的存储
    一、图的存储方式   图的存储主要分为五类:邻接矩阵、边集数组、邻接表、链式邻接表、链式前向星。1.邻接矩阵    用二维数组w[u][v]表示从u到v的边权    时间复杂度:O(n^2)    空间复杂度:O(n^2)1.模板//图的存储for(inti=1;i<=m;++i){......
  • C++基础知识7 list
    list1.list的介绍及使用1.1list的介绍1.2list的使用1.2.1list的构造1.2.2listiterator的使用1.2.3listcapacity1.2.4listelementaccess1.2.5listmodifiers1.2.6list的迭代器失效2.1模拟实现list1.list的介绍及使用1.1list的介绍1.2list的使用1.......
  • 深入剖析:C++类对象的内存布局与优化
    深入剖析:C++类对象的内存布局与优化引言在C++编程中,理解类对象的内存布局对于优化内存使用和提高程序性能至关重要。本文将详细介绍C++类对象的内存布局,包括数据成员、虚函数表指针以及静态变量和静态方法在内存中的位置。通过这些知识,我们可以更好地设计和优化我们的类结......
  • C++ 带约束的Ceres形状拟合
    C++带约束的Ceres形状拟合一、CeresSolver1.定义问题2.添加残差AddResidualBlockAutoDiffCostFunction3.配置求解器4.求解5.检查结果二、基于Ceres的最佳拟合残差结构体拟合主函数三、带约束的Ceres拟合残差设计拟合区间限定四、拟合结果bestminmax五、完整代......