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

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

相关推荐
起名字真南7 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
少年负剑去8 分钟前
第十五届蓝桥杯C/C++B组题解——数字接龙
c语言·c++·蓝桥杯
cleveryuoyuo8 分钟前
AVL树的旋转
c++
tyler_download19 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~19 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#20 分钟前
go mod 依赖管理
开发语言·后端·golang
小春学渗透21 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
杜杜的man24 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
亦世凡华、24 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
神仙别闹31 分钟前
基于MFC实现的赛车游戏
c++·游戏·mfc