《算法通关村--不简单的字符串转换问题之将字符串转换为32位有符号整数》

实现一个myAtoi(string s )函数,这个函数的作用是根据指定规则将输入的字符串转换为32位有符号整数。 (32位有符号整数就是int类型数据范围,最高位表示正负,其余31位表示数据范围,这个范围就是-2147483648~2147483647)

转换规则如下:

前导空格+正负符号位+数字

1.去除前导空格

2.读入下一个字符,如果是‘+’或者‘-’,对应输出的正负数。如果没有正负字符则跳过这一步检测

3.继续读取字符,如果是数字就读取,只要不是数字就中断读取。

4.如果输出的整数在[-2^31,2^31-1]范围外,需要截断这个整数,使其保持在这个范围内。

5.只能使用int类型去存储输出结果不可以使用long类型存储。

转换规则示例:

输入:“       23”

输出:23

解析:去除前导空格,然后输出读取到的数字

输入:“    -42”

输出42

解析:去除前导空格,然后读取正负符号,并输出数字-42

输入:“23adfa12312”

解析:逐个读取时碰到字母a不是数字,中断读取,这个时候输出就是23

输出:23

输入:“1232546547658675”

输出:2147483647

解析:超出范围,输出最大范围2147483647

代码:

public static int myAtoi(String str){
        
        char[] chars = str.toCharArray();
        int len = str.length();
        //定义指针逐个读取字符
        int index = 0;
        //规则1:去除前导空格
        while (index<len){
            if (chars[index]==' '){
                index++;
            }else {
                break;
            }
        }
        //防止用例是极端情况全是空格“       ”,所以这里直接返回
        if (index==len){
            return 0;
        }
        //定义sign用于标记正负
        int sign = 1;
        //规则2:判断正负
        char firstChar = chars[index];
        if (firstChar=='+'){
            index++;
        }else if (firstChar=='-'){
            sign =-1;
            index++;
        }
        //规则5:定义一个int类型数据用于存储输出结果
        int res = 0;
        while (index<len){
            char c = chars[index];
            //规则3:只要不是数字直接中断读取
            if (c<'0'||c>'9'){
                break;
            }

            //规则4:处理溢出问题
            if (res>Integer.MAX_VALUE/10||res==Integer.MAX_VALUE/10&&Integer.MAX_VALUE%10<(c-'0')){
                return Integer.MAX_VALUE;
            }
            if (res<Integer.MIN_VALUE/10||res==Integer.MIN_VALUE/10&&Integer.MIN_VALUE%10>-(c-'0')){
                return Integer.MIN_VALUE;
            }
            //注意!这里要sing * (c-'0') 而不是 (c-'0')
            res =res*10+sign*(c-'0');
            index++;
        }
        return res;
    }

溢出问题:

        如果直res =res * 10 + sign *(c-'0'),可能会超出int的范围,会抛出异常。所以提前判断是否溢出。判断溢出分成两部分逻辑判断,一部分逻辑是直接 /10,判断res十位到最高位部分是否会溢出,另一部分逻辑是%10取余判断个位的数字是否会超出范围溢出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值