将字符串转换为整数(java)
题目描述:
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数;
数值为0或者字符串不是一个合法的数值(第一个非空格字符不是一个有效整数字符、字符串为空、字符串仅包含空白字符)则返回0;
要求数值范围在[-231,231-1],超出此范围的直接返回-231或231.
样例:
输入:“42”
输出:42
输入:" -42"
输出:-42
输入:“4293 with words”
输出:4293
输入:“words with 4293”
输出:0
输入:"-982353948578392"
输出:-2147483648
注:输出为int类型最小值-231
题解:
先把字符串首尾空格去掉;
再把字符串每一个字符都放进一个char型数组中便于遍历;
再判断整数的符号,即第一位是否为‘-’;
最后遍历char数组依次把数字字符转换成数值,期间判断数值是否越界,并以非有效整数字符为结尾。
返回值将数值的符号加上,通过乘以1或-1的方式。
代码:
public static int strToInt(String str) {
//trim()方法删除字符串两端的空格,toCharArray()方法将字符串中的字符存进一个字符数组中
char[] c = str.trim().toCharArray();
if(c.length == 0)
return 0;
int res = 0, bndry = Integer.MAX_VALUE / 10;
//sign用于记录整数的符号
int i = 1, sign = 1;
if(c[0] == '-')
sign = -1;
else if(c[0] != '+')
//如果是带符号数,就从第二位字符(i=1)开始转换整数;如果没有带符号,就从第一位字符(i=0)开始转换整数
i = 0;
for(int j = i; j < c.length; j ++) {
if(c[j] < '0' || c[j] > '9')
//如果第一位不是数字就是非法情况,不用转换,直接跳出循环返回值为0
break;
if(res > bndry || res == bndry && c[j] > '7') {
//处理数值越界情况
if(sign == 1)
return Integer.MAX_VALUE;
if(sign != 1)
return Integer.MIN_VALUE;
}
//c[j]-'0'使字符类型的数字转换成int类型
res = res*10 +(c[j] - '0');
}
return sign * res;
}
res=res*10+(c[j]-‘0’) :每次循环加入一个数字的时候将上次计算的结果乘10,相当于向前进一位,再把本次循环的数字直接加上,即新加入的数字放在个位上。
231-1=2147483647,所以要判断越界就要在每次循环中判断上次循环的结果是否大于214748364(边界前九位),
res > bndry :如果上次的结果已经大于边界前九位,那么下一个数字不用加了,上次循环的结果已经越界,直接跳出;
res==bndry&&c[j]>‘7’ :如果上次的结果刚好等于边界的前九位数,那么就看新加入的数字是否大于边界的最后一位’7’,如果大于,就是在本次循环越界,也要跳出。
精炼的解答:
public static int strToInt(String str) {
//trim()方法删除字符串两端的空格,toCharArray()方法将字符串中的字符存进一个字符数组中
char[] c = str.trim().toCharArray();
if(c.length == 0)
return 0;
int res = 0, bndry = Integer.MAX_VALUE / 10;
int i = 1, sign = 1;
if(c[0] == '-') sign = -1;
else if(c[0] != '+') i = 0;
for(int j = i; j < c.length; j++) {
if(c[j] < '0' || c[j] > '9') break;
if(res > bndry || res == bndry && c[j] > '7') return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
res = res * 10 + (c[j] - '0');
}
return sign * res;
}