Question :
Implementatoito 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) 对溢出全部采用减法(-)判断,有效预防了加法运算可能的溢出问题,非常值得借鉴!