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