8. 字符串转换整数 (atoi)

这道题看起来不难,但是他要考虑的小细节也太多了。除了题目中已经给出来的样例,还有几个测试过程中发现的样例。考虑还是不够全面

整数溢出这一块处理的还是不够好。

INT_MIN=-2^31=-2147483648

INT_MAX=2^31-1=2147483647

刚开始只是简单处理

对于 ans1=ans0*10+str[i]    当ans0<INT_MIN/10 或者ans1>INT_MAX/10,时就判断其溢出,后来发现过于粗略了,例如

输入:"2147483646"

预期:2147483646

但是在我的考虑下输出:2147483647,只判断了个位以外的情况,没有判断前9位=214748364,而最后一位<7的情况,此时并没有溢出

还有就是

输入:"+1"    预期:1

需要注意一下

class Solution {
public:
    int myAtoi(string str) {
        int len=str.length(),ans=0;
        string result;
        int flag=0;   //flag用来存储是否找到了开头
        bool zheng=true;   //用来记录结果是正是负
        for(int i=0;i<len;i++){
            if(flag==0){
                if(str[i]==' ');  //跳过开头的空格
                else if(str[i]=='-'){
                    result+='-';
                    flag=1;
                    zheng=false;
                }
                else if(str[i]=='+'){
                    flag=1;
                }
                else if(isdigit(str[i])){
                    ans=str[i]-48;
                    // cout<<str[i]<<":::"<<ans<<endl;
                    flag=1;
                }
                else {
                    return 0;
                }
            }
            else{
                if(isdigit(str[i])){
                    if(zheng==false){   //如果是负数
                        if(-ans<INT_MIN/10 || (-ans==INT_MIN/10 && str[i]-48>=8)){   
                            return INT_MIN;
                        }
                    }
                    else if(zheng=true){
                        if(ans>INT_MAX/10 ||(ans==INT_MAX/10 && str[i]-48>=7)){
                            return INT_MAX;                                                        
                        }
                    }
                    ans=ans*10-48+str[i];
                }
                else{
                    break;
                }
            }
            
        }
        if(zheng==false){
            return -ans;
        }
        else{
            return ans;   
        }
        
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值