leetcode-個人題解8

LEETCODE專題


8. String to Integer (atoi)

題目要求:
這裏寫圖片描述


這裏其實就是將atoi函數自己實現一遍。
這道題同學在完成的時候用了stringstream,用的代碼規模很小,基本上就是幾個讀寫和判斷就搞定了。然而時間稍微有點長。。。花了將近32ms的時間。我在完成這道題的時候全程沒有用到stringstream,堅持用string的數組操作來一個字符一個字符的檢查,這樣雖然代碼規模比較大,寫起來判斷也稍微多了點,但是效率高了很多,只花了10ms。

  • 這裏就簡單說一下用到的幾個判斷:
    • 輸入字符的判斷:是否是符號’+’、’-‘,是否是字母(其實後來想想應該是沒有必要的,可以刪去),是否是數字
    • 輸出數字溢出的判斷:正數是否大於最大正數,負數是否小於最小負數(因爲最大的正數和最小的負數絕對值不一樣,所以我選擇分開比較

接下來直接上code:

class Solution {
public:
    bool isDigit(char a) {
        return a >= '0' && a <= '9';
    }

    bool isLetter(char a) {
        return (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z');
    }

    bool isSign(char a) {
        return a == '+' || a == '-';
    }

    bool isValid(char a) {
        return isDigit(a) || isLetter(a) || isSign(a);
    }

    int myAtoi(string str) {
        // get the index of the first char except ' '
        int index = 0;
        string result;
        while (index < str.length() && str[index] == ' ') index++;
        if (index == str.length() ) return 0;
        while (index < str.length() && isValid(str[index]) ) {
            if (isLetter(str[index]) ) {
                break;
            } else if (isSign(str[index]) ) {
                if (result.size() > 0) {
                    break;
                } else {
                    if (isSign(result[result.length() - 1]) ) {
                        return 0;
                    } else {
                        result += str[index++];
                    }
                }
            } else {
                result += str[index++];
            }
        }

        if (result.length() == 0) return 0;

        /* if the sum is out of range,
         * set it to be INT_MAX OR INT_MIN
         */
        int sum = 0;
        if (isSign(result[0])) {
            index = 1;
        } else {
            index = 0;
        }
        while (index < result.length() ) {
            if (result[0] != '-') {
                if (sum > (INT_MAX - (result[index] - '0') ) / 10) {
                    return INT_MAX;
                } else {
                    sum = sum * 10 + (result[index++] - '0');
                }
            } else if (result[0] == '-') {
                if (sum < (INT_MIN + (result[index] - '0') ) / 10) {
                    return INT_MIN;
                } else {
                    sum = sum * 10 - (result[index++] - '0');
                }
            }
        }
        return sum;
    }
};

時間複雜度:O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章