先忽略前面的空白,遇到不是空白的字元後開始判斷第一個字是不是 +
、 -
或數字,不是就直接傳 0 ,是的話就開始將這裡開始到最後不是數字的地方變成一個整數。
轉成整數的做法就是利用 ASCII 碼中,數字每個字元與 0
字元兩個值的距離就是該數字字元所代表的數字,然後一位一位塞進去變數中。判斷 Overflow 的方法跟第七題差不多,在會 Overflow 的前一刻確定一旦將這位數字移進去會不會 Overflow 即可。
C++(12ms)
/*******************************************************/
/* LeetCode 8. String to Integer (atoi) */
/* Author: Maplewing [at] knightzone.studio */
/* Version: 2018/09/28 */
/*******************************************************/
#include <climits>
#include <cctype>
class Solution {
public:
int myAtoi(string str) {
int startIndex = 0;
for(startIndex = 0; startIndex < str.length() ; ++startIndex){
if(str[startIndex] != ' ') break;
}
if(!isdigit(str[startIndex]) &&
str[startIndex] != '-' &&
str[startIndex] != '+' ) return 0;
int sign = 1;
if(str[startIndex] == '-'){
sign = -1;
++startIndex;
}
else if(str[startIndex] == '+'){
++startIndex;
}
int value = 0;
int maxIntDiv10 = INT_MAX / 10;
int minIntDiv10 = INT_MIN / 10;
int maxIntLowestDigit = INT_MAX % 10;
int minIntLowestDigit = INT_MIN % 10;
for(int i = startIndex ; i < str.length() && isdigit(str[i]) ; ++i){
int digit = str[i] - '0';
int currentValue = value * sign;
if(currentValue > maxIntDiv10 || (currentValue == maxIntDiv10 && digit > maxIntLowestDigit)) return INT_MAX;
if(currentValue < minIntDiv10 || (currentValue == minIntDiv10 && digit * sign < minIntLowestDigit)) return INT_MIN;
value = value * 10 + digit;
}
return value * sign;
}
};