Question :
Implement atoi to convert a string to an integer.
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
Anwser 1 :
class Solution {public: int atoi(const char *str) { // Start typing your C/C++ solution below // DO NOT write int main() function long long ret = 0; const char *p = str; while(*p == ' ') p++; bool valid = true; while(valid && *p == '+') { valid = false; p++; } while(*p == '0') p++; bool minus = false; if(*p == '-'){ minus = true; p++; } while(*p != '/0'){ if(*p >= '0' && *p <='9'){ ret = ret * 10 + *p - '0'; if(!minus && ret > INT_MAX) return INT_MAX; // positive and overflow if(minus && -ret < INT_MIN) return INT_MIN; // negative and overflow p++; } else { // no digit then break break; } } return minus ? -ret : ret; }};
注意點:
1) 結果變數 ret 設為了長整形(long long),防止溢出; 最後結果由長整形自動截取為整形(int),返回
2) 計算得到結果時,需要配合正負符號判斷是否已經越界,越界溢出後直接返回
Anwser 2 :
class Solution { public: int atoi(const char *str) { // Start typing your C/C++ solution below // DO NOT write int main() function assert(str != NULL); while(isspace(*str)) str++; // remove ' ' int sign = (*str == '-') ? -1 : 1; if (*str == '-' || *str == '+') // if can check one char str++; int ret = 0; while(isdigit(*str)) // is digit { int digit = *str - '0'; if (INT_MAX / 10 >= ret) ret *= 10; else return sign == -1 ? INT_MIN : INT_MAX; if (INT_MAX - digit >= ret) ret += digit; else return sign == -1 ? INT_MIN : INT_MAX; str++; } return ret * sign; } };
注意點:
1) 結果類型為整形(int),不需要轉化,非常好!
2) 對空格(‘ ’)、數字(isdigit)都直接調用函數,非常簡潔!
3) 對溢出全部採用減法(-)判斷,有效預防了加法運算可能的溢出問題,非常值得借鑒!