题目:LeetCode 008 String to Integer
题意:完成内置函数atoi的功能,将字符串转换成整数。
教训:一开始理所应当的随便一写,然后发现有很多的异常情况需要处理。然后按照C++ Reference中关于atoi的规定一条一条写,才AC。另外还有一个溢出的问题,一开始以为int会自动处理直接返回边界值,其实不是,如果溢出的话大于2147483647的数会给变成负数,因此要单独判断是否会大,但是设置成longlong 之后出现的问题是,还有可能会溢出longlong,所以每次对ans进行改变之后都要判断是否在integer的范围之内。
atoi的函数规则:http://www.cplusplus.com/reference/cstdlib/atoi/
1、前导空格忽略
2、判断是否是以'+'、'-'为前导来规定整数的正负
3、在整数后面有非数字的字符则忽略返回前面的整数
4、如果无法构成有效整数,即含有其他乱七八糟字符,返回0
5、如果超出整数范围,大于的返回INT_MAX=2147483647,小于的返回INT_MIN=-2147483648.
代码如下:
class Solution { public: int myAtoi(string str) { int len = str.size(), i = 0, flag = 1; const int MAX = 2147483647, MIN = -2147483648; long long ans = 0; // 可能有前导空格 while(str[i] == ' ') i++; // 可能在前面有表示正负的符号 if(str[i] == '-') { flag = -1; i++; } else if(str[i] == '+') i++; while(i < len) { // 保证加起来的字符为有效数字 if(str[i] <= '9' && str[i] >= '0') { ans *= 10; ans += (str[i++]-'0'); if(ans*flag > MAX) return MAX; if(ans*flag <MIN) return MIN; } // 可能最后有其他字符 else break; } ans *= flag; if(ans > MAX) return MAX; else if(ans <MIN) return MIN; return ans; } };