• String to Integer (atoi)


    Implement atoi to convert a string to an integer.

    Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

    Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

    Update (2015-02-10):
    The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button  to reset your code definition.

    spoilers alert... click to show requirements for atoi.

    //没有时间做优化,不过个人估计测试集中缺少例如1.2e、.123e4、123..1e3这些数字的判断

    class Solution {
    public:
        int myAtoi(string str) {
            
            //判断字符串是否未定义或者为空
            if(""==str) return 0;
            
            bool sign=false,esign=false; 
            int i=0,j=0,_sign=1,x=0,e=0;
            double num=0.0,tmp_num;
            
            for(i=0;i<str.length();i++)
            {
                if(!sign) //对字符串初始部分进行处理
                {
                    if(' '==str[i]) continue;
                    else if('+'==str[i])
                    {
                        sign=true; continue;
                    }else if('-'==str[i])
                    {
                        sign=true; _sign=-1; continue;
                    }else if('e'==str[i]||'E'==str[i])
                    {
                        return 0;
                    }
                }
                
                sign=true; //初始部分处理完毕标记sign
                if(isdigit(str[i]))
                {
                    if(!x) //无小数部分
                    {
                        num=num*10+str[i]-'0';
                    }else  //含小数部分
                    {
                        num+=(str[i]-'0')/pow(10,x);
                        x++;
                    }
                }else if('.'==str[i])
                {
                    if(x) return _sign*num; //遇到小数点重复情况
                    else x++;
                }else if('e'==str[i]||'E'==str[i])
                {
                    for(j=i+1;j<str.length();j++)
                    {
                        if(isdigit(str[j]))
                        {
                            e=e*10+str[j]-'0';
                        }else
                        {
                            break;
                        }
                    }
                    break; //跳出字符串循环
                }else
                {
                    num*=_sign; tmp_num=num*pow(10,e);
                    if(tmp_num>INT_MAX||tmp_num<INT_MIN)
                    {
                        if(num>INT_MAX) return INT_MAX;
                        else if(num<INT_MIN) return INT_MIN;
                        else return (int)num;
                    }else
                    {
                        return (int)tmp_num;
                    }
                }
            }
            
            num*=_sign; tmp_num=num*pow(10,e);
            if(tmp_num>INT_MAX||tmp_num<INT_MIN)
            {
                if(num>INT_MAX) return INT_MAX;
                else if(num<INT_MIN) return INT_MIN;
                else return (int)num;
            }else
            {
                return (int)tmp_num;
            }
        }
    };

    此处学习到str[i]是char,传递进入函数的时候需注意。

    ""是字符串,''是字符,亦需要注意;

    最后num=str[i]-'0',很巧妙啊,isdigit亦可以用此代替。

  • 相关阅读:
    安卓 Context 和 Application的关系
    Android Intent应用
    android launchmode(四种启动模式)应用场景及实例
    返回数据给上一个活动
    Intent传参数
    安卓activity生命周期
    如何将nideshop部署到本地
    navicat链接数据库错误2013
    数据库设计三大范式
    nodejs版本升级
  • 原文地址:https://www.cnblogs.com/jason1990/p/4641199.html
Copyright © 2020-2023  润新知