8.文字列回転整数(atoi)


テストケース:
「+-2」予想は0「2.14予想は2」「+0 123」予想は0「92233720366854775808」予想は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;
    
        }
    
    
    };