[C++初阶]string的几道oj题

1.LCR 192. 把字符串转换成整数 (atoi)

这题难度不大,我这里采取遍历跳过空格的方式,我先展示出我的代码,然后慢慢讲解:

cpp 复制代码
class Solution {
public:
    int myAtoi(string str) 
    {
         if (str.empty()) 
         return 0;
        int length=str.size();
        int i=0;
        int symbol=1;
        int sum=0;
        while(i<length && str[i]==' ')
        {
            ++i;
        }

        if(i<length && str[i]=='+'||str[i]=='-')
        {
            if(str[i]=='-')
            symbol=-1;
            ++i;
        } 
        
        while(i<length && isdigit(str[i]))
        {
            int a=str[i]-'0';
            if(sum>(INT_MAX-a)/10)
            {
                if(symbol==1)
                return INT_MAX;
                else
                return INT_MIN;
            }
            sum=sum*10+a;
            ++i;
        }
        return sum*symbol;
    }
};

首先我们先排除特殊情况,判断这个string是否为空

下面我们对我们所需要的一些数据进行初始化

length是string的长度

i是遍历的位置

symbol是正负号,1为正号,-1为负号。

sum为最后遍历出的结果计算的和。

做这道题我们首先要理清楚思路,

有以下四种情况需要考虑:

  1. 首部空格: 忽略之即可;

  2. 符号位: 三种情况,即 ''+++'' , ''−-−'' , ''无符号" ;用一个变量保存符号位,返回前判断正负;

  3. 非数字字符: 遇到首个非数字的字符时,直接返回;

  4. 数字字符:

  5. 字符转数字: "此数字的 ASCII 码" 与 '0' 相减即可;

  6. 数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为 sum ,则数字拼接公式为:

x=c-'0'

sum=sum*10+x。

用例的示意图(可能不大准确):

我们先遍历排除开头空格,然后记录符号

接下来我们要记录数字,这里我采用一个自带的函数

判断此时读入的是否为数字,是数字则读入

注意:我们要判断是否超过了int的最大值或最小值,而且要保证自己的int类型不超过int的最大值或最小值

因此,这里我把等式左边的操作移到了等式右边。

如果超出了最值,我们接下来通过symbol的值来判断是最大值还是最小值,然后返回相应结果。

如果读完了所有的数,都没有超出最值,那么我们直接调用上面我们写的公式返回

2.415. 字符串相加

这题明显比上面一道题简单,老规矩,先上代码

cpp 复制代码
class Solution {
public:
    string addStrings(string num1, string num2) {
        int i = num1.length() - 1, j = num2.length() - 1, add = 0;
        string ans = "";
        while (i >= 0 || j >= 0 || add != 0) {
            int x = i >= 0 ? num1[i] - '0' : 0;
            int y = j >= 0 ? num2[j] - '0' : 0;
            int result = x + y + add;
            ans.push_back('0' + result % 10);
            add = result / 10;
            i -= 1;
            j -= 1;
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

首先我们先求出最后一位的下标(string中数的最后一位就是下标最后一位)

同时我们一块定义好我们的进位值,因为我们进行的是10进制计算。大于10要进1,因为一开始,没有进位,所以add=0

我们再创建一个新的string用来存放计算结果:

我们先把string是的数从字符类型转换成数字类型,然后计算(记得加上进位值)

然后我们把它尾插入我们创建的新的string中(这里我选择采用尾插,但也可以用头插(但是头插的时间复杂度更高,因为每次头插都要移动位置))

然后我们调整下标和进位值

最后我们调用reverse函数,翻转一下顺序

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

这题难度也不大,我们之后可以用哈希表来解决,这里我选择采用计数数组来解决这个问题

cpp 复制代码
class Solution {
public:
    int firstUniqChar(string s) {
        int count[26] = {0};
        for(auto ch : s)
        {
            count[ch-'a']++;
        }
        for(int i = 0; i < s.size(); i++)
        {
            if(count[s[i]-'a'] == 1)
            {
                return i;
            }
        }
        return -1;
    }
};

把字符串遍历使对应数组++,然后再次遍历数组输出唯一字符.

相关推荐
蜀黍@猿14 分钟前
【C++ 基础】从C到C++有哪些变化
c++
Am心若依旧40916 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生18 分钟前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
zh路西法26 分钟前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern
c++·决策树·状态模式
大G哥27 分钟前
java提高正则处理效率
java·开发语言
VBA633738 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~39 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳1 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
lxyzcm1 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23