2020年6月17日 星期三

LeetCode 8. String to Integer (atoi) [Medium] [C++] 解題筆記

這題要我們實作一個將 string 換成 integer 的函數,類似 atoi 的功能。

EX:

        Input: " -42"

       Output: -42
       Explanation: The first non-whitespace character is '-', which is the minus sign.
                             Then take as many numerical digits as possible, which gets 42.
想法:
    這題非常多有的沒的情況,具體還是去看8. String to Integer (atoi) 給的說明吧。簡而言之這題非常的繁瑣
,沒啥特別的技巧,就是要小心注意各種情況 例如:overflow , edge case ex: 0-1, +-2 ... 之類的,
這邊就簡單紀錄一下程式碼。

Complexity: O(n) time, O(1) space.

完整程式碼:
class Solution {
public:
    int myAtoi(string str) {
        if (str.empty()) { return 0; }
        int res = 0;
        bool flag = false;
        int sign = 0;
        for (int i = 0; i < str.size(); i++) {
            if (str[i] == ' ') { 
                if (flag || sign != 0) { 
                    return (sign == 0)? res : res * sign;
                }
                continue; 
            }
            if (str[i] == '-') {
                if (flag || sign != 0) { 
                    return (sign == 0)? res : res * sign;
                }
                sign = -1;
                continue;
            }
            if (str[i] == '+') {
                if (flag || sign != 0) { 
                    return (sign == 0)? res : res * sign;
                }
                sign = 1;
                continue;
            }
            if ((int(str[i]) < 48 || int(str[i]) > 57)) {
                return (sign == 0)? res : res * sign;
            }
            if (sign >= 0 && res > INT_MAX / 10) {
                return INT_MAX;
            }
            if (sign == -1 && res > INT_MAX / 10) {
                return INT_MIN;
            }
            if (res == INT_MAX / 10 && int(str[i] - '0') > 7) {
                return (sign == -1)? INT_MIN : INT_MAX;
            }
            res = res * 10 + (int(str[i]) - '0');
            flag = true;
            //cout<<res<<endl;
        }
        
        return (sign == 0)? res : res * sign;
    }
};   


沒有留言:

張貼留言