CodeTop044 字符串转换整数 (atoi)

字符串转换整数 (atoi)
这题说起来没什么难度,但是细节很多,然后情况也很多.首先,最好是不要用Integer.VauleOf()将string转int.主要是很多情况都考虑不到.然后最好还是用数乘的方式,这样的比较好.
好好coding吧 其它的也没啥好说的.
比较精彩的部分就是符号的设置,还有就是超出最大和最小值时的判断,尤其是最小值的时候,很是精彩

public class Solution044 {
    public static void main(String[] args) {
        System.out.println(myAtoi("+-12"));
    }

    public static int myAtoi(String s) {
        String str = s.trim();
        StringBuffer sb = new StringBuffer();

        int sign = 1;//符号位 这个符号位我觉得设置的无敌 因为这样的话以后直接res = res*10 + sign*(str.charAt(index)-'0') 正负数全部解决了
        int index = 0;

        //判断正负号
        if (str.length() == 0) return 0;
        if (str.charAt(index) == '+') {
            index++;
        } else if (str.charAt(index) == '-') {
            sign = -1;
            index++;
        }

        int res = 0;
        while (index < str.length()) {
            //不是数字的直接break 返回当前的res就是答案
            if (str.charAt(index) - '0' > 9 || str.charAt(index) - '0' < 0) {
                break;
            }

            //先判断res是否超过Integer.MAX_VALUE 这里的判断十分巧妙 只能是在加一位数之前判断  不然就溢出了没有意义
            //判断的条件也是很巧妙,先判断正负数是不是比Integer.MAX_VALUE/10大
            //或者此时等于Integer.MAX_VALUE/10 这个时候就要判断要加的个位 是不是大于Integer.MAX_VALUE%10(也就是Integer.MAX_VALUE的个位)
            if (res > Integer.MAX_VALUE / 10 ||
                    (res == Integer.MAX_VALUE / 10 && str.charAt(index) - '0' > Integer.MAX_VALUE % 10)) {
                return Integer.MAX_VALUE;
            }

            //这里判断的是负数是不是比Integer.MIN_VALUE小
            //先判断是不是比Integer.MIN_VALUE/10更小
            //或者此时等于Integer.MIN_VALUE/10 此时判断个位是否比Integer.MIN_VALUE%10(也就是Integer.MIN_VALUE的个位)小
            //这里注意str.charAt(index)-'0'是一个整正数 而Integer.MIN_VALUE%10是一个负数 所以判断比-(Integer.MIN_VALUE%10)大 也就是比Integer.MIN_VALUE的个位小(负数判断)
            if (res < Integer.MIN_VALUE / 10 ||
                    (res == Integer.MIN_VALUE / 10 && str.charAt(index) - '0' > -(Integer.MIN_VALUE % 10))) {
                return Integer.MIN_VALUE;
            }

            res = res * 10 + sign * (str.charAt(index) - '0');
            index++;
        }


        return res;


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值