【leetcode】StringtoInteger(atoi)
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) 对溢出全部采用减法(-)判断,有效预防了加法运算可能的溢出问题,非常值得借鉴!
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2013-04-19 23:30:26
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!