【剑指Offer】面试题67:把字符串转换成整数

import org.omg.CORBA.INTERNAL;

/**
 * 面试题67:把字符串转换成整数
 * 题目:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
 * 输入:"+2147483647"
 * 输出:2147483647
 *
 * 输入:"1a33"
 * 输出:0
 *
 * @author
 * @create 2021-05-03 22:39
 */
public class Solution67 {
    public static void main(String[] args) {

    }

    /**
     * 方法一:捕捉异常,使用包装类解析字符串,如果类型不匹配就返回0,匹配就返回结果
     * @param str
     * @return
     */
    public static int strToInt(String str) {
        if (str == null || str.equals("")){
            return 0;
        }
        try {
            int res = Integer.parseInt(str);
            return res;
        }catch (NumberFormatException e){
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 方法二:正则表达式判断格式 + 结果溢出判断
     * @param str
     * @return
     */
    public static int strToIntTwo(String str){
        //不符合正则匹配表达的返回0
        // \d代表[0-9] 但是要写成\\d才行。[] 字符集。匹配包含的任一字符. ?零次或一次匹配前面的字符或子表达式
        // + 一次或多次匹配前面的字符或子表达式
        if (!str.matches("[+,-]?\\d+")){
            return 0;
        }
        //接下来判断是否越界
        int len = str.length();
        int i = len - 1;
        long res = 0;//long类型,避免溢出。不能用int
        //保证字符串中的每个字符都在0~9之间,这个判断是因为第0位可能是符号位,如果是符号位就退出循环
        while (i >= 0&& str.charAt(i) >= '0' && str.charAt(i) <= '9'){
            res += Math.pow(10, len - 1 - i) * (str.charAt(i) - '0');
            i--;
        }
        res = str.charAt(0) == '-' ? -res : res;
        //溢出就返回0,用long类型的res来比较,
        //如果定义为int res,那再比较就没有意义了,int范围为[-2147483648,2147483647]
        if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE){
            return 0;
        }
        return (int) res;
    }


    /**
     * 方法三:
     * @param str
     * @return
     */
    public static int strToIntThree(String str){
        if (str == null || str.trim().equals("")){
            //trim()用于删除字符串的头尾空白符
            return 0;
        }
        str = str.trim();
        int i = 0;
        int flag = 1;
        int res = 0;
        if (str.charAt(i) == '-'){
            flag = -1;
        }
        if (str.charAt(i) == '+' || str.charAt(i) == '-'){
            i++;
        }
        while (i < str.length()){
            if (str.charAt(i) >= '0' && str.charAt(i) <= '9'){
                int cur = str.charAt(i) - '0';
                if (flag == 1 && (res > Integer.MAX_VALUE/10 || res == Integer.MAX_VALUE/10 && cur > 7)){
                    return 0;
                }
                if (flag == -1 && (res > Integer.MAX_VALUE/10 || res == Integer.MAX_VALUE/10 &&cur > 8)){
                    return 0;
                }
                res = res*10 + cur;
                i++;
            }else {
                return 0;
            }
        }
        return res * flag;
    }

    /**
     * 方法三简洁的写法
     * @param str
     * @return
     */
    public static int strToIntFour(String str){
        if (str == null || str.trim().equals("")){
            //trim()用于删除字符串的头尾空白符
            return 0;
        }
        int length = str.length();
        int isNegtive = 1, overValue = 0;
        int digit = 0, value = 0;

        int index = 0;
        if (str.charAt(index) == '-'){
            isNegtive = -1;
            index++;
        }else if (str.charAt(index) == '+'){
            index++;
        }

        while (index < length){
            digit = str.charAt(index) - '0';
            // overValue表示当前的值和Integer.MAX_VALUE/10的差,因为Integer.MAX_VALUE/10为正数,
            // 所以当当前值为负数时,需要统一转化为正数.
            // 当 overValue > 0 时,越界,overValue < 0 时,不越界,而当 overValue == 0 时:
            // 正数时(isNegtive == 1),digit > 7 越界,负数时(isNegtive == -1),digit > 8 越界
            // digit 的判断统一转化为: ((isNegtive + 1) / 2 + digit) > 8
            overValue = isNegtive * value - Integer.MAX_VALUE / 10 +
                    (((isNegtive + 1) / 2 + digit) > 8 ? 1: 0);
            if (digit < 0 || digit > 9){
                return 0;
            }else if(overValue >0){
                return 0;
            }
            value = value * 10 + isNegtive * digit;
            index++;
        }
        return value;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值