剑指Offer67

该博客主要介绍了如何实现一个将字符串转换为整数的函数,处理空格、符号、非数字字符和数字越界等问题。解题思路包括删除首部空格、判断符号、处理非数字字符以及数字拼接,并在拼接过程中检查是否超出32位整数的范围。代码示例给出了C++的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指Offer67

题意

 解题思路

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

  1. 首部空格: 删除之即可;
  2. 符号位: 三种情况,即 ''+'' , ''−'' , ''无符号" ;新建一个变量保存符号位,返回前判断正负即可
  3. 非数字字符: 遇到首个非数字的字符时,应立即返回。
  4. 数字字符:
    1. 字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可;
    2. 数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为:res = 10*res+(c-'0)

数字越界问题:

        题目要求返回的数值范围应在[\large -2^{31},2^{31}-1] 。因此需要考虑数字越界问题。而由于题目指出,环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终持 res 在 int 类型的取值范围内。

        \large 2^{31}-1 = 2147 4836 47

        在每轮数字拼接前,判断 res 在此轮拼接后是否超过 2147 4836 47 ,若超过则加上符号位直接返回。在拼接之前必须判断这一步,否则会报错。

        设数字拼接边界 boundary= 2147 4836 47 / 10 = 2147 4836 4 ,则以下两种情况越界:

  1. res>boundary:执行拼接后, 10*res ≥ 2147 4836 50 。这已经超出了INT_MAX
  2. res=boundary,x>7 :执行拼接后,res=2147 4836 48 或 res = 2147 4836 49。也已经超出了INT_MAX

C++题解

class Solution 
{
public:
    int strToInt(string str) 
    {
        int res=0,boundary=INT_MAX/10;
        int i=0,sign=1,len=str.size();
        while(str[i]== ' ')
        {
            if(++i==len) //全都是空格的情况
                return 0;
        }
        if(str[i]=='-')
            sign=-1;
        if(str[i]=='-'||str[i]=='+')
            i++;
        
        for(int j=i;j<len;++j)
        {
            if(str[j]<'0'||str[j]>'9')
                break;
            int x = str[j]-'0';
            if(res>boundary)
            {
                return sign==-1?INT_MIN:INT_MAX;
            }
            else if(res==boundary&&x>7)
            {
                return sign==-1?INT_MIN:INT_MAX;
            }
            else
            {
                res = res*10+x;
            }
        }
        return sign*res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心之所向便是光v

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值