问题:
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.
解决:
考虑一个字符串是不是数字时需要考虑的特殊字符有空格 ‘ ’, 小数点 '.', 自然数 'e/E', 还要加上正负号 '+/-"。
【函数说明】atoi() 函数会扫描 str 字符串,跳过前面的空白字符(例如空格,tab缩进等),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。
【返回值】返回转换后的整型数;如果 str 不能转换成 int 或者 str 为空字符串,那么将返回 0。如果超出Integer的范围,将会返回Integer最大值或者最小值。
【处理思路】按照函数说明来一步步处理。首先判断输入是否为null。然后使用trim()函数删掉空格。判断是否有正负号,做一个标记。返回的是整型数,可以使用double来暂存结果。按位来计算出结果。如果遇到非数字字符,则返回当前结果。加上前面的正负号。结果若超出了整形范围,则返回最大或最小值。最后返回处理结果。
在discuss上看到的测试用例:
Input | Output | Expected |
" b11228552307" | 2147483647 | 0 |
"+-2" | 2 | 0 |
" -0012a42" | 0 | -12 |
" +0 123" | 123 | 0 |
" 10522545459" | 1932610867 | 2147483647 |
① 直接转化,使用一个标记flag表示是否存在+-号。
class Solution { //39ms
public int myAtoi(String str) {
if(str == null || str.length() == 0) return 0;
str = str.trim();
int flag = 1;
int i = 0;
double res = 0;
if(str.charAt(0) == '-'){
flag = -1;
i ++;
}else if(str.charAt(0) == '+'){
i ++;
}
while(i < str.length() && str.charAt(i) >= '0' && str.charAt(i) <= '9'){
res = res * 10 + str.charAt(i) - '0';
i ++;
}
if(flag == -1) res = res * flag;
if(res > Integer.MAX_VALUE) res = Integer.MAX_VALUE;
if(res < Integer.MIN_VALUE) return Integer.MIN_VALUE;
return (int) res;
}
}
② 进化版,还是用上面一种方法比较好。。。
public class Solution { //37ms
public int myAtoi(String str) {
int i = 0;
int sign = 1;
int res = 0;
//1. 空字符串
if(str.length() == 0) return 0;
//2. 移除空格
while(str.charAt(i) == ' ' && i < str.length())
i ++;
//3. 处理正负号
if(str.charAt(i) == '+' || str.charAt(i) == '-'){
sign = str.charAt(i) == '+' ? 1 : -1;
i ++;
}
//4. 转换数字,并处理溢出
while(i < str.length()){
int digit = str.charAt(i) - '0';
if(digit < 0 || digit > 9) break;
if(Integer.MAX_VALUE / 10 < res || Integer.MAX_VALUE / 10 == res && Integer.MAX_VALUE % 10 < digit)
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
res = 10 * res + digit;
i ++;
}
return res * sign;
}
}