leetcode-個人題解8
阿新 • • 發佈:2019-02-07
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)