1. 程式人生 > >leetcode-個人題解8

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)