《程序员代码面试指南》将整数字符串转成整数值——java实现

将整数字符串转成整数值

题目描述:

给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str所代表的整数值,否则返回0。
【举例】

str=“123”,返回123。
str=“023”,因为"023"不符合日常的书写习惯,所以返回0。
str=“A13”,返回0。
str=“0”,返回0。
str=“2147483647”,返回2147483647。
str=“2147483648”,因为溢出了,所以返回0。
str="-123",返回-123。

题目难度:

medium

题目思路:

  1. 将给定字符串转为字符数组;
  2. 判断该数组是否符合要求,即:①首位为“-”,长度为1或者-0的情况;②首位为“-”,下一位不是数字;③首位不是数字;④从第二位开始其他位是否符合要求。判断该数组是否符合要求,即:①首位为“-”,长度为1或者-0的情况;②首位为“-”,下一位不是数字;③首位不是数字;④从第二位开始其他位是否符合要求。
  3. 如果不符合要求,直接返回0;如果不符合要求,直接返回0;
  4. 如果符合要求:就需要进行边界判断。如果符合要求:就需要进行边界判断。
  5. 进行边界判断:先判断是正数还是负数,以便接下来取位。然后将所有的数都变为负数,因为负数的绝对值比正数大1;一旦发生越界,就不用进行加操作了,直接返回0;如果没有越界,且是正数的时候,还要判断是否转负后与最小值相等,如果是,也返回0;进行边界判断:先判断是正数还是负数,以便接下来取位。然后将所有的数都变为负数,因为负数的绝对值比正数大1;一旦发生越界,就不用进行加操作了,直接返回0;如果没有越界,且是正数的时候,还要判断是否转负后与最小值相等,如果是,也返回0;
  6. 最后如果是正数,则取负。返回最终转化的整数结果。最后如果是正数,则取负。返回最终转化的整数结果。

代码实现:

 public static int convert(String string) {
        if (string == null || string.length() == 0) {
            return 0;
        }
        char[] chs = string.toCharArray();
        if (!isValid(chs)) {
            return 0;
        }
        boolean positive = chs[0] != '-';
        int minH = Integer.MIN_VALUE / 10;
        int minT = Integer.MIN_VALUE % 10;
        int res = 0;
        for (int i = positive ? 0 : 1; i < chs.length; i++) {
            int cur = '0' - chs[i];
            if ((minH > res) || (minH == res && cur < minT)) {
                return 0;   //要进行边界判断,如果当前值超出了最小值的范围,就不用接下来的加操作了
            }
            res = res * 10 + cur;
        }
        if (positive && res == Integer.MIN_VALUE){
            return 0;
        }
        return positive? -res : res;
    }

    private static boolean isValid(char[] chs) {
        if (chs[0] == '-' && (chs.length == 1 || chs[1] == 0)) {
            return false;
        }
        if (chs[0] != '-' && (chs[0] < '0' || chs[0] > '9')) {
            return false;
        }
        if (chs[0] == '0' && chs.length > 1){
            return false;
        }
        for (int i = 1; i < chs.length; i++) {
            if (chs[i] < '0' || chs[i] > '9') {
                return false;
            }
        }
        return true;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值