一:解题思路
这个题目没有太多复杂的算法,只是考虑以及考察的边界条件较多。
1.可以有前导空格或前导0,但不能有其他前导字符。
2.可能会有一个加号或减号表示正负,也可能没有,连续的多个加号或者减号则视为不合法。
3.紧接着是一段连续的数字,如果没有数字则视为不合法。
4.数字后的其他字符都可以忽略。
5.如果数字大于int的最大值或小于int的最小值,返回相应的极值即可。
6.字符串如果不能合法的转为整数,则返回0.
二:完整代码示例 (C++版和Java版)
C++:
class Solution { public: int myAtoi(string str) { int maxValue = 2147483647; int minValue =-2147483648; int start = 0, p = 0, n = str.size(); bool negative = false; while (p < n && str[p] == ' ') p++; if (p == n) return 0; if (str[p] == '+') { p++; } else if (str[p] == '-') { p++; negative = true; } while (p < n && str[p] == '0') p++; start = p; while (p < n && str[p] >= '0' && str[p] <= '9') p++; if (p == start) return 0; if (p - start > 10) { if (negative) return minValue; else return maxValue; } long num = 0; for (int i = start; i < p; i++) num = num * 10 + (str[i]-'0'); num = negative ? -num : num; if (num < minValue) return minValue; else if (num > maxValue) return maxValue; else return (int)num; } };
Java:
class Solution { public int myAtoi(String str) { int start=0,p=0,n=str.length(); boolean negative=false; while(p<n && str.charAt(p)==' ') p++; if(p==n) return 0; if(str.charAt(p)=='+') { p++; } else if(str.charAt(p)=='-') { p++; negative=true; } while(p<n && str.charAt(p)=='0') p++; start=p; while(p<n && str.charAt(p)>='0' && str.charAt(p)<='9') p++; if(p==start) return 0; if(p-start>10) { if(negative) return Integer.MIN_VALUE; else return Integer.MAX_VALUE; } long num=0; for(int i=start;i<p;i++) num=num*10+(str.charAt(i)-'0'); num=negative?-num:num; if(num<Integer.MIN_VALUE) return Integer.MIN_VALUE; else if(num>Integer.MAX_VALUE) return Integer.MAX_VALUE; else return (int)num; } }