a********n 发帖数: 1287 | 1 按照c++ reference. 输入错误返回0,上溢返回INT_MAX, 下溢返回INT_MIN.
谢谢。
//return 0 if invalid
int atoi(const char*s) {
assert(s);
const char *p = s;
int sign = 1;
int limit = INT_MAX;
int n = 0;
//skip space
while(*p == ' ') {
p++;
}
if(*p == '-') {
sign = -1;
p++;
limit = INT_MIN;
}else if(*p == '+'){
p++;
}
while(*p) {
if(*p>='0' && *p<='9'){
if(n > INT_MAX/10) {
return sign? INT_MAX: INT_MIN;
}
n *= 10;
if(n > INT_MAX - *p + '0) {
return sign? INT_MAX: INT_MIN;
}
n += *p - '0';
p++;
}else{
return 0;
}
}
return sign * n;
} |
i**********e 发帖数: 1145 | 2 基本思路对,但可能有些 case 考虑不全,例如 INT_MIN = -2147483648,不是 -
2147483647(考虑 int 为 32-bit),要小心处理这个溢出,很多人很容易掉进的陷阱。
还有就是 "1a",应该 output 是 1,而不是 0。
不过我觉得这些细节不大要紧,最重要是问好问题来,知道 input requirement就好了。
可以在这里执行你的代码:
http://www.leetcode.com/onlinejudge
Problem: String to Integer (atoi)
Progress: 23/30 test cases passed.
input output expected
"-2147483648" 2147483647 -2147483648
"-2147483649" 2147483647 -2147483648 |
a********n 发帖数: 1287 | 3 Thanks
这个网站不错,才知道还有这么个地方。
阱。
了。
【在 i**********e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 基本思路对,但可能有些 case 考虑不全,例如 INT_MIN = -2147483648,不是 - : 2147483647(考虑 int 为 32-bit),要小心处理这个溢出,很多人很容易掉进的陷阱。 : 还有就是 "1a",应该 output 是 1,而不是 0。 : 不过我觉得这些细节不大要紧,最重要是问好问题来,知道 input requirement就好了。 : 可以在这里执行你的代码: : http://www.leetcode.com/onlinejudge : Problem: String to Integer (atoi) : Progress: 23/30 test cases passed. : input output expected : "-2147483648" 2147483647 -2147483648
|
L***Q 发帖数: 508 | 4 assert(s)应该不对,s为null应该返回0.
const char *p = s;必要不大,可以直接在s上操作,已经是const char*了。俺贴一下
俺的,在http://www.leetcode.com/onlinejudge上测试通过了。
思路比较简单,在判断overflow上借鉴了ihasleetcode大牛用long long的方法。
- step1:NULL string和空string的判断
- step2:跳过最初的空格,判断符号
- step3:读取字符直到非数字。用long long保存中间结果,和INT_MAX和INT_MIN比较
。这样比较简单。
int atoi(const char* str)
{
if ((str == NULL) || (*str == '\0'))
return 0;
bool sign = false;
while (*str == ' ')
str ++;
if (*str == '-')
{
sign = true;
str ++;
}
else if (*str == '+')
str ++;
long long val = 0;
while ((*str >= '0') && (*str <= '9'))
{
val = val*10 + (*str - '0');
long long tmp = val;
if (sign == true)
tmp = -val;
if (tmp >= INT_MAX)
return INT_MAX;
else if (tmp <= INT_MIN)
return INT_MIN;
str ++;
}
if (sign == true)
return -val;
else
return val;
};
【在 a********n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 按照c++ reference. 输入错误返回0,上溢返回INT_MAX, 下溢返回INT_MIN. : 谢谢。 : //return 0 if invalid : int atoi(const char*s) { : assert(s); : const char *p = s; : int sign = 1; : int limit = INT_MAX; : int n = 0; : //skip space
|