LeetCode String to Integer (atoi)

来源:互联网 发布:微博怎么设置个性域名 编辑:程序博客网 时间:2024/06/07 01:21

一、试题

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.

二、代码

试了好多次

        static int x=[](){            // toggle off cout & cin, instead, use printf & scanf            std::ios::sync_with_stdio(false);            // untie cin & cout            cin.tie(NULL);            return 0;        }();class Solution {public:    int myAtoi(string str) {        空字符直接返回        if(str.size()==0)            return 0;        该题中只会开头出现空格,除掉        int pos=0;        if( (pos = str.find_first_not_of(' '))!=0 )            str.erase(0,pos);        对第一个字符进行专门处理        long long res = 0;        bool flag=false;        if(str[0]=='-')            flag = true;        else if(str[0]>='1' && str[0]<='9'){            res = str[0]-'0';        }else if(str[0]!='+' && str[0]!='0')            return 0;        除去开头的0        if( (pos = str.find_first_not_of('0',1))!=1 && str[0]<'1' && str[0]>'9')            str.erase(0,pos);        else            str.erase(0,1);        正常遍历处理        for(int j=0; j<str.size(); j++){            if(str[j]>='0' && str[j]<='9'){                res = 10*res+str[j]-'0';            }else                break;             if(flag && -res<INT_MIN){                res = -INT_MIN;                break;             }            if(!flag && res>INT_MAX){                res = INT_MAX;                break;            }        }        return flag?-res:res;    }};

别人代码写的就是优雅:
一开始除掉空格,然后在对正负号进行判断时如果判断为正负号则位置i++,这样可以保证为正负号时i会变成第一位数字,不为时还是第一位数字。另外开头的0其实对于计算过程没有影响。第三就是在判断INTMAX和INTMIN巧妙利用INTMIN绝对值大于INTMAX仅是1,判断大于INTMAX后可以直接通过正负号判定输出。

        static int x=[](){            // toggle off cout & cin, instead, use printf & scanf            std::ios::sync_with_stdio(false);            // untie cin & cout            cin.tie(NULL);            return 0;        }();class Solution {public:    int myAtoi(string str) {        int i = str.find_first_not_of(' '), s = 1;        long res = 0;        if(str[i]=='+'||str[i]=='-')             s = (str[i++]=='+')?1:-1;        while(isdigit(str[i])) {            res = res*10 + (str[i++]-'0');            if(res>INT_MAX) return s>0?INT_MAX:INT_MIN;        }        return s*res;    }};
原创粉丝点击