leetcode 8. 字符串转换整数 (atoi)【简单模拟】

一个简单模拟写了50分钟 。。错了5次。。没谁了

(1/6) 准确率16%...哎(好像正好和题目的准确率一样...)【大哥求你细心点!!!!】

执行用时 : 8 ms, 在String to Integer (atoi)的C++提交中击败了95.34% 的用户

内存消耗 : 8.6 MB, 在String to Integer (atoi)的C++提交中击败了76.54% 的用户

class Solution {
public:
    int myAtoi(string str) {
        //多种情况
        //注意正号!!!
        int sz=str.size(),i=0;
        while(i<sz&&str[i]==' ')
        {
            i++;
        }
        if(i==sz||((str[i]!='-'&&str[i]!='+')&&(str[i]>'9'||str[i]<'0'))) return 0;//空串 or 无效(非正负号开头,0-9)
        string s="";
        if(str[i]=='-') //负数
        {
            s+='-';i++;
            if(i==sz) return 0;
            if(!(str[i]<='9'&&str[i]>='0')) return 0;//无效
        }
        else if(str[i]=='+') //特殊
        {
            i++;
            if(i==sz) return 0;
            if(!(str[i]<='9'&&str[i]>='0')) return 0;//无效
        }
        int is_0=1;//是否属于前导0
        while(str[i]<='9'&&str[i]>='0'&&i<sz)
        {
            if(str[i]!='0')
            {
                s+=str[i];
                is_0=0;
                
            }
            if(str[i]=='0'&&is_0==0)
                s+=str[i];         
            i++;            
            
        }
        if(s[0]=='-'&&s.size()==1) return 0;//只有一个-
        if(s.size()==0) return 0;
        
        int max1=INT_MAX;
        int min1=INT_MIN;
        string max2,min2;
        stringstream ss;
        ss<<max1;ss>>max2;
        stringstream sss;
        sss<<min1;sss>>min2;
        if(s[0]=='-') 
        {
            if(s.size()>min2.size())
                return INT_MIN;
        }
        else if(s.size()>max2.size()) return INT_MAX;
        
        stringstream ans;
        ans<<s;
        
        long long tmp;ans>>tmp;
        
        if(tmp<INT_MIN) return INT_MIN;
        if(tmp>INT_MAX) return INT_MAX;
        
        return tmp;
        
        
    }
};

 

膜拜一下某位大佬的简洁版本:

class Solution {
public:
    int myAtoi(string str) {
        int i=0;
        long res=0;
        int sign=1;
        while(i<str.size() && str[i]==' ') ++i;
        if(i == str.size()) return 0;
        if(str[i]=='-') {sign=-1;i++;}
        else if(str[i]=='+') i++;          
        while(i<str.size() && isdigit(str[i]))
        {
            res=res*10+(str[i++]-'0');
            if(res>INT_MAX){
                if(sign==1) return INT_MAX;
                else return INT_MIN;
            }
        }
        return res*sign;
    }
};
//作者:li-ming-hui-2

 

相比于我的代码,他的优点:

直接用res代表了最后结果输出的一部分:// return res*sign; 

这样的好处显而易见:最主要的原因是来自于:

while(i<str.size() && isdigit(str[i]))
        {
            res=res*10+(str[i++]-'0');
            if(res>INT_MAX){
                if(sign==1) return INT_MAX;
                else return INT_MIN;
            }
        }
 

 他在中间进行判断,而不是和我一样用stringstream完成后先用长度筛选,再用long long 赋值。及时止损,防止溢出。

 

这样以来节省了很多事。

 

特别是这一句:

if(res>INT_MAX){
                if(sign==1) return INT_MAX;
                else return INT_MIN;

这个地方,用res和INT_MAX 比较。虽然看似忽略了一点:

INT_MAX: (2^31 − 1) ;

INT_MIN : (−2^31);  

绝对值是不同的。所以这样的判定看似太粗糙。

但仔细想想:当res>INT_MAX的时候,是不是最小就是INT_MAX+1,也就是INT_MIN的相反数?所以这是没问题的。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值