力扣第八题 myatoi

本文探讨了一段C++代码,该代码用于将字符串转换为整数。作者指出,原始实现存在不必要的复杂性,并提出了改进方案,包括简化数字正负号的判断、减少条件检查以及优化数值累加的过程。通过这些优化,代码变得更加简洁且效率更高。同时,作者提到了从前往后遍历数字字符串时需要注意的上溢问题。
摘要由CSDN通过智能技术生成

这一题其实并不算难,只是在考验细心程度而已。
这是我第一次提交的代码

class Solution {
public:
    int myAtoi(string& s) {
        int len = s.size();
        int pre = 0;
        long long ans = 0,k;
        while(s[pre] == ' ')
        pre ++;
        if(s[pre] == '-')
        {
            k = -1;
            pre++;
        }
        else if(s[pre] == '+')
        {
            k = 1;
            pre++;
        }
        else if(s[pre] <= '9' && s[pre] >= '0')
        {
            k = 1;
        }
        else
        {
            return ans;
        }
        while(s[pre] == '0')
        pre++;
        int cur = pre;
        while(s[cur] >= '0' && s[cur] <= '9'&& cur < len)
        {
            cur++;
        }
        cur--;
        while(pre <= cur)
        {
            ans += k*(s[cur] - '0');
            k*=10;
            cur--;
            if(ans >= INT_MAX || k > LLONG_MAX/10)
            {
                return INT_MAX;
            }
            else if(ans <= INT_MIN || k < LLONG_MIN/10)
            {
                return INT_MIN;
            }
        }
        return ans;
    }
};

足足写了五十多行,其中很多东西都是没有必要的。

//判断是否为数字的条件不需要写
s[pre] <= '9' && s[pre] >= '0';
//而是写成
isdigit(s[pre]);
//我写的判断正负号太复杂了
//应该把判断符号和移动pre分成两部分
//最后的else用处不大可以删掉
//变成下面这样,k初始化为1;
if(s[pre] == '-') k = -1;
if(s[pre] == '-' || s[pre] == '+') pre++;
//怎么把数字加入到ans当中
//我的方法是从后往前遍历
while(s[pre] == '0')
        pre++;
        int cur = pre;
        while(s[cur] >= '0' && s[cur] <= '9'&& cur < len)
        {
            cur++;
        }
        cur--;
        while(pre <= cur)
        {
            ans += k*(s[cur] - '0');
            k*=10;
            cur--;
            if(ans >= INT_MAX || k > LLONG_MAX/10)
            {
                return INT_MAX;
            }
            else if(ans <= INT_MIN || k < LLONG_MIN/10)
            {
                return INT_MIN;
            }
        }
        return ans;
    }

这样的确可以解决问题,但是很麻烦,因为k也可能上溢,需要额外判断。如果写成从前往后遍历就会简单一点。

while(isdigit(s[pre]) && pre < len)
        {
            int num = s[pre] - '0';
            if(ans > INT_MAX/10 || ans == INT_MAX/10 && num > 7)  return INT_MAX;
            if(ans < INT_MIN/10 || ans == INT_MIN/10 && num > 7)  return INT_MIN;
            ans = ans*10 + k*num;
            pre++;
        }

从前往后有个坑要注意,就是判断上溢时,如果ans == INT_MAX就要再判断INT_MAX的最后一位(是6)和num谁大.只有num比6大的时候才能返回INT_MAX.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值