LeetCode 腾讯精选练习50 题——8. 字符串转换整数 (atoi)

题目

LeetCode 腾讯精选练习50 题——8. 字符串转换整数 (atoi)

LeetCode 腾讯精选练习50 题——8. 字符串转换整数 (atoi)

解答

解答前看清楚题目给出的示例,有助于了解可能会出现的所有情况。

按照题目的意思,可以成功转换为整数的例子应该是:

1. 在整数(该整数可能会带‘+’或‘-’)前的字符必须都为空格

2. 在整数部分中一旦出现不是数字的字符,该字符后面的字符都直接舍弃,不会进行转换

第一次的时候因为不清楚,写的代码比较混乱,如下:

class Solution {
public:
    int myAtoi(string str) {
        if(str.length() < 1)
            return 0;
        int ans = 0;
        int positive = 1;
        bool num_meet = false, n_p = false;
        for(int i = 0; i < str.length(); i++) {
            if(!num_meet && n_p && (str[i]<'0' || str[i]>'9'))
                return 0;
            if(!num_meet && str[i] == ' ')
                continue;
            if(str[i] == '-' && positive == 1 && !num_meet && !n_p) {
                n_p = true;
                positive = -1;
                continue;
            }
            if(str[i] == '+' && positive == 1 && !num_meet && !n_p) {
                n_p = true;
                positive = 1;
                continue;
            }
            if(!num_meet && (str[i]<'0' || str[i]>'9'))
                return 0;
            if(num_meet && (str[i]<'0' || str[i]>'9'))
                return ans;
            num_meet = true;
            if(positive == 1 && (ans > INT_MAX/10 || (ans==INT_MAX/10 && str[i]-'0' > 7)))
                return INT_MAX;
            if(positive == -1 && (ans < INT_MIN/10 || (ans==INT_MIN/10 && str[i]-'0' > 8)))
                return INT_MIN;
            ans = -positive * (-abs(ans)*10 - (str[i]-'0'));
        }
        return ans;
    }
};

第二次的时候,参考了博客https://blog.csdn.net/weixin_38976558/article/details/85602031,感觉代码思路清晰了很多,如下:


class Solution {

public:

    int myAtoi(string str) {
        if(str.length()==0)
            return 0;
        int negative=1;
        int ans=0;
        int i=0;
        while(str[i]==' ')
            i++;
        if(str[i]=='-')
        {
            negative = -1;
            i++;
        }
        else if(str[i]=='+')
        {
            negative = 1;
            i++;
        }
        if(str[i]<'0'||str[i]>'9')
            return 0;
        while(str[i]!='\0'&&str[i]>='0'&&str[i]<='9')
        {
            if(negative == 1 && (ans > INT_MAX/10 || (ans==INT_MAX/10 && str[i]-'0' > 7)))
                return INT_MAX;
            if(negative == -1 && (ans < INT_MIN/10 || (ans==INT_MIN/10 && str[i]-'0' > 8)))
                return INT_MIN;
            ans = -negative * (-abs(ans)*10 - (str[i]-'0'));
            i++;
        }
        return ans;
    }

};