1、前言
题目描述2、思路
这个题目有两个比较重要的思路:
1)先处理前后的空格(使用 trim() 函数即可,或者手动一个个处理)。此时前后没有空格,开始判断第一个符号是否是正负数,如果是负数则记录符号,正数也记录一下。
2)越界使用 MAX / 10 的方式提前判断。
后面的处理就简单了,只需要一个个遍历,直到遇到不是数字直接 break,最后的结果就是数字 * 符号。
3、代码
class Solution {
public int strToInt(String str) {
if (str == null || str.length() == 0) {
return 0;
}
char[] array = str.trim().toCharArray();
if (array.length == 0) {
return 0;
}
int res = 0, sign = 1;
int i = 0, boundary = Integer.MAX_VALUE / 10;
if(array[0] == '-'){
sign = -1;
i++;
}else if(array[0] == '+'){
i++;
}
for(int j = i; j < array.length; j++){
if(array[j] < '0' || array[j] > '9'){
break;
}
// max = 2147483647, min = -2147483648。
// 结果都大于 max / 10,说明乘10肯定大于 max。
// 结果等于 max / 10,如果后面位数大于7,则说明大于 max;且可能等于或者大于 min(没乘负数),则直接返回最大最小
if(res > boundary || (res == boundary && array[j] > '7')){
return sign == -1 ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
res = res * 10 + (array[j] - '0');
}
return res * sign;
}
}
网友评论