把字符串转换成整数(最详细解答)

题目要求:

分析:

  • 把一个一个字符以整数的形式来进行输出,需要考虑相互转化的问题
  • 不能使用库函数!!!
  • 首尾会有空格(进行去空格操作,可以减少不必要的判断)
  • 区分正负正数
  • 结果可能会越界,题目给的是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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值