问题描述:
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.
原问题链接:https://leetcode.com/problems/string-to-integer-atoi/
问题分析
相对比较简单的问题,将字符串转换成对应的整数。针对这个问题有一些情况需要考虑,很容易在实现的时候有遗漏。典型的来说有这么几种情况:
1. 字符串开头有显示正负符号"+" "-" ,这种情况下对首字母要判断。
2. 字符串开头结尾有空白字符,要将这些去掉。
3. 字符串中间有非数字的符号。对于这种情况有值得商榷的地方。一种是返回一个目前能解析到的值,一种也可以是报错。
4. 还有就是解析的数字太大,导致数字溢出了。比如大于或者整数所能表示的最大最小值,这个时候就返回对应的最大最小值就可以了。防止整数表示溢出,也可以采用类似的策略,用一个long类型来保存解析的结果。然后在一边解析的时候一边判断是否溢出。
按照这个思路,可以得到如下的代码:
public class Solution {
public int myAtoi(String str) {
if(str == null || str.length() == 0) return 0;
str = str.trim();
char c = str.charAt(0);
int flag = 1, start = 0;
long result = 0;
if(c == '-') {
flag = -1;
start++;
} else if(c == '+') {
start++;
}
for(int i = start; i < str.length(); i++) {
char ch = str.charAt(i);
if(!Character.isDigit(ch)) break;
result = result * 10 + ch - '0';
if(flag == 1 && result >= Integer.MAX_VALUE) return Integer.MAX_VALUE;
if(flag == -1 && result * flag <= Integer.MIN_VALUE) return Integer.MIN_VALUE;
}
return (int)result * flag;
}
}
总结
这个问题在很多的面试情况下有问到。一个是它看起来并不复杂,几乎每个人都能想到一点思路。但是里面要考虑的细节比较多,很容易遗漏。所以对细节的全面考虑还是很重要的。