剑指 offer 刷题(29)——把字符串转换成整数

一、题目

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。

输入描述:输入一个字符串,包括数字字母符号,可以为空

输出描述:如果是合法的数值表达则返回该数字,否则返回 0
在这里插入图片描述

二、思路

如果是一个只含有数字的字符串,转换成数字很简单。从左到右每次取一位字符 digit,利用 result = result * 10 + digit 最后计算出整个数字。期间要处理的关键问题是正负数的数值越界问题。

正负数问题:

建立一个 flag 标志,若字符串的第一个字符为 ‘-’,flag = 1,表示负数;否则,flag = 0,表示正数。

正负数数值越界问题:

数值越界,即大于 2147483647(利用 Integer.MAX_VALUE 得到),或小于 -2147483648。观察程序发现,每次循环时 result 的值都会扩大10倍然后加上当前读到的字符 digit ,得到一个结果。所以,我们就可以利用 INT_MAX / 10 的值来提前一步判断是否会越界,如下:

  • 当 result > MAX_VALUE / 10 时,说明本次循环扩大 10 倍后,不管加不加当前读到的字符位,result 都必将越界(超过 INT_MAX);
  • 当 result = MAX_VALUE / 10 时,本次循环扩大 10 倍后,则还要根据当前读到的字符位 digit 来进行判断:正数的话,当 digit > 7 时,越界;负数的话,当 digit > 8 时,越界。

两条判断语句分别为:

// 正数的越界判断
if(flag == 0 && (result > Integer.MAX_VALUE/10 || result == Integer.MAX_VALUE / 10 && c[i] > 55))
	return 0;
// 负数的越界判断
if(flag == 1 && (result > Integer.MAX_VALUE/10 || result == Integer.MAX_VALUE / 10 && c[i] > 56))
	return 0;

三、代码

public class Solution {
    public int StrToInt(String str) {
        if(str.length() == 0 || str.equals(""))
            return 0;
        char[] c = str.toCharArray();
        int result = 0;
        int flag = 0;// 符号位标志位,0表示正数,1表示负数
        if(c[0] == '-')
            flag = 1;
        //
        for(int i = flag; i < c.length; i++){
            if(c[i] == '+')
                continue;
            if(c[i] < 48 || c[i] > 57)
                return 0;
            // 正数的越界判断
            if(flag == 0 && (result > Integer.MAX_VALUE/10 || result == Integer.MAX_VALUE / 10 && c[i] > 55))
                return 0;
            // 负数的越界判断
            if(flag == 1 && (result > Integer.MAX_VALUE/10 || result == Integer.MAX_VALUE / 10 && c[i] > 56))
                return 0;
            result = result * 10 + c[i] - 48;
        }
        return flag == 0 ? result : result * (-1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值