剑指13(将字符串转换为整数)

将字符串转换为整数(java)

题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数;
数值为0或者字符串不是一个合法的数值(第一个非空格字符不是一个有效整数字符、字符串为空、字符串仅包含空白字符)则返回0;
要求数值范围在[-231,231-1],超出此范围的直接返回-231或231.

样例
输入:“42”
输出:42

输入:" -42"
输出:-42

输入:“4293 with words”
输出:4293

输入:“words with 4293”
输出:0

输入:"-982353948578392"
输出:-2147483648
注:输出为int类型最小值-231

题解
先把字符串首尾空格去掉;
再把字符串每一个字符都放进一个char型数组中便于遍历;
再判断整数的符号,即第一位是否为‘-’;
最后遍历char数组依次把数字字符转换成数值,期间判断数值是否越界,并以非有效整数字符为结尾。
返回值将数值的符号加上,通过乘以1或-1的方式。

代码

public static int strToInt(String str) {
      //trim()方法删除字符串两端的空格,toCharArray()方法将字符串中的字符存进一个字符数组中
         char[] c = str.trim().toCharArray();
         if(c.length == 0)
          return 0;
         int res = 0, bndry = Integer.MAX_VALUE / 10;
         //sign用于记录整数的符号
         int i = 1, sign = 1;
         if(c[0] == '-')
          sign = -1;
         else if(c[0] != '+')
          //如果是带符号数,就从第二位字符(i=1)开始转换整数;如果没有带符号,就从第一位字符(i=0)开始转换整数
          i = 0;
         for(int j = i; j < c.length; j ++) {
          if(c[j] < '0' || c[j] > '9')
           //如果第一位不是数字就是非法情况,不用转换,直接跳出循环返回值为0
           break;
          if(res > bndry || res == bndry && c[j] > '7') {
           //处理数值越界情况
           if(sign == 1)
            return Integer.MAX_VALUE;
           if(sign != 1)
            return Integer.MIN_VALUE;
          }
          //c[j]-'0'使字符类型的数字转换成int类型
          res = res*10 +(c[j] - '0');
         }
         
         return sign * res;
     }

res=res*10+(c[j]-‘0’) :每次循环加入一个数字的时候将上次计算的结果乘10,相当于向前进一位,再把本次循环的数字直接加上,即新加入的数字放在个位上。

231-1=2147483647,所以要判断越界就要在每次循环中判断上次循环的结果是否大于214748364(边界前九位),
res > bndry :如果上次的结果已经大于边界前九位,那么下一个数字不用加了,上次循环的结果已经越界,直接跳出;
res==bndry&&c[j]>‘7’ :如果上次的结果刚好等于边界的前九位数,那么就看新加入的数字是否大于边界的最后一位’7’,如果大于,就是在本次循环越界,也要跳出。

精炼的解答

public static int strToInt(String str) {
      //trim()方法删除字符串两端的空格,toCharArray()方法将字符串中的字符存进一个字符数组中
         char[] c = str.trim().toCharArray();
         if(c.length == 0)
          return 0;
         int res = 0, bndry = Integer.MAX_VALUE / 10;
         int i = 1, sign = 1;
         if(c[0] == '-') sign = -1;
         else if(c[0] != '+') i = 0;
         for(int j = i; j < c.length; j++) {
             if(c[j] < '0' || c[j] > '9') break;
             if(res > bndry || res == bndry && c[j] > '7') return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
             res = res * 10 + (c[j] - '0');
         }
         return sign * res;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值