把字符串转换成整数(最详细解答)
题目要求:
分析:
把一个一个字符以整数的形式来进行输出,需要考虑相互转化的问题 不能使用库函数!!! 首尾会有空格(进行去空格操作,可以减少不必要的判断) 区分正负正数 结果可能会越界,题目给的是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; } }
上一篇:
通过多线程提高代码的执行效率例子