由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 写了个atoi,大家帮看有没有哪里错了?
相关主题
请教一个题: Median of Two Sorted Arrays问两道bloomberg的题目
帮忙看看我写的atoi有没有bug, 谢谢atoi很不好写,头都大了...
atoi overflow怎么办?函数atoi的实现
经典题atoi的溢出处理判断BT是否BST?
关于atoi的overflow判断是不是binary search tree-leetcode
问一个atoi overflow的问题str2int中overflow该如何处理?
写程序时的一个小问题?请教一个题目
onsite完,攒rp系列(二)如何判断是否会溢出
相关话题的讨论汇总
话题: int话题: max话题: min话题: sign话题: return
进入JobHunting版参与讨论
1 (共1页)
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 的大作中提到】
: 基本思路对,但可能有些 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 的大作中提到】
: 按照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

1 (共1页)
进入JobHunting版参与讨论
相关主题
如何判断是否会溢出关于atoi的overflow
大家来看看判断三角形形状这个代码有没有问题,谢谢问一个atoi overflow的问题
reverse an integer 怎么判断是否 overflow 来着写程序时的一个小问题?
请问这个3sumClosestonsite完,攒rp系列(二)
请教一个题: Median of Two Sorted Arrays问两道bloomberg的题目
帮忙看看我写的atoi有没有bug, 谢谢atoi很不好写,头都大了...
atoi overflow怎么办?函数atoi的实现
经典题atoi的溢出处理判断BT是否BST?
相关话题的讨论汇总
话题: int话题: max话题: min话题: sign话题: return