剑指offer-67、字符串转换整数
本题主要是对多种输入情况的讨论:
-
首部空格:删除即可;
-
符号位:三种情况,”+“,”-“,”无符号“;新建一个变量保存符号位,返回前判断正负即可。
-
非数字字符:遇到首个非数字的字符时,应立即返回。
-
数字字符:
- 字符转数字:遇到首个非数字的字符时,应立即返回。
- 数字拼接:res = res * 10 + ascii(c) - ascii('0')
-
数字越界处理:判断res在此轮拼接后是否超过2147483647,若超过,则加上符号位直接返回。
- 设数字拼接边界 bound = 2147483647 // 10 = 214748364 ,则以下两种情况越界:
- res>bound 执行拼接res *10>= 2147483650
- res=bound, c>'7' 执行拼接后是2147483648或2147483649
- 设数字拼接边界 bound = 2147483647 // 10 = 214748364 ,则以下两种情况越界:
class Solution {
public int strToInt(String str) {
char[] arr = str.trim().toCharArray();
if (arr.length == 0) {//字符串长度为0
return 0;
}
int res = 0;
int bound = Integer.MAX_VALUE / 10;
int index = 1;//若有正负号,则数字位从index = 1开始
int sign = 1;//标记正负号
if (arr[0] == '-') {
sign = -1;
} else if (arr[0] != '+') {//无正负号情况
index = 0;//数字为从1开始
}
for (int i = index; i < arr.length; i++) {
if (arr[i] < '0' || arr[i] > '9') {//非数字字符
break;
}
if (res > bound || (res == bound && arr[i] > '7')) {//越界分为两种情况
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
res = res * 10 + arr[i] - '0';
}
return sign * res;
}
}