剑指offer67 把字符串转换成整数

在每轮数字拼接前,判断 resres 在此轮拼接后是否超过 2147483647,若超过则加上符号位直接返回。设数字拼接边界 bndry=2147483647 // 10=214748364,则以下两种情况越界:

res>bndry                    情况一:执行拼接10×res≥2147483650越界

res=bndry,x>7          情况二:拼接后2147483648或2147483649

public int strToInt(String str){
        int res=0;//结果
        int bndry=Integer.MAX_VALUE/10;
        int index=0;
        int len=str.length();
        int sign=1;//正负符号
        if(len==0) return 0;
        while (str.charAt(index)==' '){
            if(++index==len) return 0;
        }
        if(str.charAt(index)=='-') sign=-1;
        if(str.charAt(index)=='+'||str.charAt(index)=='-') index++;
        for(int j=index;j<len;j++){
            if(str.charAt(j)<'0'||str.charAt(j)>'9') break;
            //判断数字越界
            //这里这个条件的意思为,因为题目要求不能超过int范围,所以需要判断结果是否越界
            //因为res每次都会 * 10 ,所以外面定义了一个int最大值除以10的数字
            //此时只需要保证本次循环的res * 10 + chars[j] 不超过 int 即可保证不越界
            //res > bndry 意思是,此时res已经大于bndry了,他 * 10 一定越界
            //res == bndry && chars[j] > '7' 的意思是,当res == bndry时,即:214748364
            //此时res * 10 变成 2147483640 此时没越界,但是还需要 + chars[j],
            //而int最大值为 2147483647,最小值-2147483648,所以当chars[j] > 7 时会越界
            if(res>bndry||res==bndry&&str.charAt(j)>'7')
                return sign==1?Integer.MAX_VALUE:Integer.MIN_VALUE;
            res=res*10+(str.charAt(j)-'0');
        }
        return sign*res;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值