1. 程式人生 > >leedcode 第八題 字串轉整數 (atoi)

leedcode 第八題 字串轉整數 (atoi)

class Solution {

public:    
    int myAtoi(string str) {
        int FirstIs=0;
        string result;
        int stop;
        int Num;
        for( int i=0;i<str.length();i++){
            char NowChar = str[i];
            if( NowChar == ' ')                 //空格字元都不儲存
                continue;
            result.push_back(NowChar);
            
            
            if (!result.empty()){               //首字母判斷
                stop = i+1;
                if ( isdigit(result[0]))        //首字元數字
                {
                    stop = i;
                    FirstIs= 1;
                } 
                if ( result[0] == '-')        //首字元‘-’
                {
                    FirstIs= 2;
                }
                if ( result[0] == '+')        //首字元‘+’
                {
                    FirstIs= 3;
                }
               
                
                break;
            }
        }

        switch(FirstIs){
            case 0: return 0;
            default: Num = StringProcess(str,stop,FirstIs); return Num;

        }      
    }

 public:
    int StringProcess(string input, int start, int Symbol){
        int Num = 0;
        bool Spill = false;
     
        for (int i =start; i<input.length(); i++){
            char NowChar = input[i];

                
            if( !isdigit(NowChar) )     //數字斷開
            {
                break; 
            }
            
            int pop = NowChar - '0'; //數字字元變數字
            
            if (Num > INT_MAX/10 || (Num == INT_MAX / 10 && pop > 7))
            {
                Spill = true;
                Num = pow(2,31)-1;
                break;
            }  
            
            Num = Num*10 + pop;     
        }

        
        if (Symbol == 2 && !Spill) //是負數,沒超
            Num =- Num;
        if (Symbol == 2 && Spill) //是負數,超了
            Num =-pow(2,31);
            
        return Num;
    }
    

};

string stringToString(string input) {
    assert(input.length() >= 2);
    string result;
    for (int i = 1; i < input.length() -1; i++) {
        char currentChar = input[i];
        if (input[i] == '\\') {
            char nextChar = input[i+1];
            switch (nextChar) {
                case '\"': result.push_back('\"'); break;
                case '/' : result.push_back('/'); break;
                case '\\': result.push_back('\\'); break;
                case 'b' : result.push_back('\b'); break;
                case 'f' : result.push_back('\f'); break;
                case 'r' : result.push_back('\r'); break;
                case 'n' : result.push_back('\n'); break;
                case 't' : result.push_back('\t'); break;
                default: break;
            }
            i++;
        } else {
          result.push_back(currentChar);
        }
    }
    return result;
}

int main() {
    string line;
    while (getline(cin, line)) {
        string str = stringToString(line);
        
        int ret = Solution().myAtoi(str);

        string out = to_string(ret);
        cout << out << endl;
    }
    return 0;
}