8. 字符串转整数 (atoi)

测试案例:

"+-2" 预期是0
"2.14预期是2"
" +0 123"预期是0
"9223372036854775808"预期是2147483647
"- 234"预期是0
"123-"预期是123

下面是反复根据测试案例最后调试成功,考虑情况太多复杂。不太好。。。

class Solution {
public:
    int myAtoi(string str) {
        int len = str.size();
        if (!len) return 0;
        long long res = 0; int flag = 1, sign = 0;
        int orderchar = len-1; int  ordernum = len-1, orderspace = 0, ordersign = len - 1;


        for (int i = 0; i < len; i++){


            if (str[i] == '-' || str[i] == '+')
            {
                
                    
                sign++;
                ordersign = i;
                
            }


            int temp = str[i] - '0';

            if (temp >= 0 && temp <= 9)
            {
                res = res * 10 + temp;
                ordernum = i;
                
            }
            else if (str[i] == ' '){
                orderspace = i;
                if (orderspace >ordernum)
                    break;
                if (orderspace > ordersign&&orderspace < ordernum)
                    return 0;

            }
            else if (str[i] == '+' || str[i] == '-')
            {
                if (ordernum < ordersign&&sign >= 1)break;
            }
            else{
                orderchar = i;
                if (orderchar < ordernum)return 0;
                break;
            }
            if (str[i] == '-')
            {

                flag = -1;
            }
            if (sign>1)return 0;

            if (res*flagINT_MAX){
                return INT_MAX;
            }
        }


        return res*flag;


    }
    
};

参考
复杂度:
时间 O(n) 空间 O(1)

思路:
字符串题一般考查的都是边界条件、特殊情况的处理。所以遇到此题一定要问清楚各种条件下的输入输出应该是什么样的。这里已知的特殊情况有:

  • 能够排除首部的空格,从第一个非空字符开始计算
  • 允许数字以正负号(+-)开头
  • 遇到非法字符便停止转换,返回当前已经转换的值,如果开头就是非法字符则返回0
  • 在转换结果溢出时返回特定值,这里是最大/最小整数

s.erase()

c++ code:


class Solution {
public:
    string &trim(string &s){
        if (s.empty()) return s;

        s.erase(0, s.find_first_not_of(" "));
        s.erase(s.find_last_not_of(" ") + 1);
        return s;
    }

public:
    int myAtoi(string str) {
        long long res = 0; int flag = 1;
        str = trim(str);
        for (int i = 0; i < str.length(); i++)
        {
            char c = str[i];
            if (i == 0 && (c == '+' || c == '-'))
            {
                flag = (c == '+' ? 1 : -1);
            }
            else if (c >= '0'&&c <= '9')
            {
                //为什么if语句在后面判断,思考
                               //例如颠倒,最后一位处理完以后将不会检查
                               //如:-2147483649,2147483648
                res *= 10;
                res += c - '0';
                if (res*flag <= INT_MIN){
                    return INT_MIN;
                }
                else if (res*flag >= INT_MAX){
                    return INT_MAX;
                }
            }
            else
            {
                return res*flag;
            }
        }
        
        return res*flag;

    }


};

你可能感兴趣的:(8. 字符串转整数 (atoi))