题目要求:
分析:
- 把一个一个字符以整数的形式来进行输出,需要考虑相互转化的问题
- 不能使用库函数!!!
- 首尾会有空格(进行去空格操作,可以减少不必要的判断)
- 区分正负正数
- 结果可能会越界,题目给的是Integer类型,当超过最大范围或者小于最小范围,有不同同的结果输出
- 不是有效转换要和越界区分开来,当首个字符是字母时或者字符数组的长度为0时,属于无效转换需要返回0
具体解题思路,代码注释全有(几乎每一行都进行了说明)
class Solution {
public int strToInt(String str) {
//去掉首尾的空格
char[] arr1 = str.trim().toCharArray();
//如果字符数组的长度为0时,没办法转化,直接返回0
if(arr1.length == 0){
return 0;
}
//记录符号位 (默认是正数,若是负数将sign置为-1)
int sign = 1;
//默认是负数,字符数组的1号位置开始遍历,若是正数,将i置为0
int i = 1;
//判断第一个位置
//是负号就将sign置为-1,并且不用更改其实判断位置i
if(arr1[0] == '-'){
sign = -1;
}
//如果不是正号也不是负号就从0号位置开始
//有正号和没有正号不影响符号位,但是影响起始判断位置
if(arr1[0] != '+' && arr1[0] != '-'){
i = 0;
}
//定义一个值,来进行判断(判断条件时会解释)
int value = Integer.MAX_VALUE / 10;
//记录返回值
int result = 0;
for(int j = i;j < arr1.length;j++){
//如果字符大于ascii码表中的范围说明是字母直接跳出
if(arr1[j] > '9' || arr1[j] < '0'){
break;
}
/*
1.到这一步时,起码证明arr1[1]这是一个数字
2.result > value 时,我们还没进行扩大倍数的运算,但是他已经比
value大了,做完扩大倍数运算肯定会越界
3.当result == value时,不一定会越界,所以取决于后面的个位,如果个位
大于Integer最大范围的个位时,那就一定会越界
4.为什么result == value时不一定越界?后续运算是 result * 10
那么此时做完运算后,等于又回到了和value相等的情况,而不是Integer
的最大范围所在的那个值,因此,越界与否完全取决于个位情况
*/
if(result > value || (result == value && arr1[j] > '7')){
//在这里返回的结果不是不能不能有效运算,而是已经越界,不能返回0
//需进行两步:1.如果sign == 1,说明时正数,返回最大范围
// 2.如果不是,那说明是负数,返回最小范围就可以了
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE ;
}
/*
1.result每更新时在前面的基础上* 10,就相当于把上一次的计算结果扩大了10倍
后面的每次做加法时,加上去的永远是个位
2.不能直接进行char和int类型的转化,在ascii码表上的1并不是int的1
因此借助char类型之间的减法可以将其转化为int
(arr1[j]- '0')代表着 '?' - '0',可以理解为我们将'0'当做理想的0
*/
result = result * 10 + (arr1[j] - '0');
}
//将符号位与结果结合,正数等于没有做变化,若负数,将等于将这个正数转为其相反数
return sign * result;
}
}