描述:
实现 atoi
,将字符串转为整数。
该函数首先根据需要丢弃任意多的空格字符,直到找到第一个非空格字符为止。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
解法:
首先,先处理第一个字符,如果第一个字符是'+'或者'-', 就置一个符号标志位,如果第一位不是符号位也不是数字位的话,那么直接返回零。 接着从第一个字符开始处理,每一个数字字符就累积起来,使用double进行保存(防止超出整数范围),遇到非数字字符的直接结束循环。
代码如下:
public int myAtoi(String str) {
if(str == null || str.trim().length() == 0)
return 0;
str = str.trim(); // 去除开始空格
char[] cs = str.toCharArray();
int sign = 1;
double res = 0;
if(cs[0] == '+')
sign = 1;
else if(cs[0] == '-' )
sign = -1;
else if(cs[0] < '0' || cs[0] > '9')
return 0;
else
res = Integer.parseInt(cs[0]+"");
for(int i = 1; i<cs.length; i++){
char c = cs[i];
if(c < '0' || c > '9')
break;
else
res = res * 10 + Integer.parseInt(c+"");
}
res = sign*res;
return res < Integer.MIN_VALUE ? Integer.MIN_VALUE : (res > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)res);
}