字符串转换整数(atoi)

字符串转换整数 (atoi)

LeetCode算法第8题:

请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
提示:
本题中的空白字符只包括空格字符 ’ ’ 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-integer-atoi
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这道题其实思路比较简单,就是对字符串的处理。我感觉这道算法本来想考验字符处理的。但是很多函数我知道,那不能当做不知道呀。我基本上使用Java自己的API来实现各种处理的。好了分析题目
1 字符串转整数: 第一时间想到的是Integer.parseInt(str)
2 丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止: 去掉两端空格 str = str.trim()
3. 第一个字符+或-或数字: 因为我已经去掉了两端的空格: str.charAt(0)取str的第一个字符串判断
4.根据题目分析除了第一个可以是+或-外,符号位后接的为必须是数字 判断数字没想到好的办法,我是将0,910个数字全部写到if里面去判断的,通过遍历str.charAt(i)取第i位的字符串
5.如果找不到有效数字(都是字符)返回0
6.溢出判断,大于int的最大值就输出int的的最大值Integer.MAX_VALUE,小于最小值输出Integer.MIN_VALUE,我这个是过 捕获异常实现的。我觉得我这种做法有点小机智,哈哈哈。不用去判断位数,写一堆算法去实现

try{
            return Integer.parseInt(str);
            //能捕获到异常,说明溢出了
        }catch (NumberFormatException e){
        	//如果符号位是负数,返回最小值,否则返回最大值
            if (str.charAt(0) == '-')
                return Integer.MIN_VALUE;
            return Integer.MAX_VALUE;
        }

全部源码(我写了注释,应该还比较好理解):

class Solution {
    public int myAtoi(String str) {
        //空字符直接返回0,免得空指针异常
        if (str==null) return 0;
        //先把空格去掉
        str = str.trim();
        //计算数组长度,如果长度为0,直接返回0
        int strLength = str.length();
        if (strLength==0) return 0;

        //这个是有效的长度,计算我要的那个数据有多长
        int intLength = 0;
        //是否有符号
        int sign=0;

        //首字母是(如果首字母是+或者-符号位是0,如果是数组开头,就是0)
        //+-符号也占用有效长度的位数
        if ((str.charAt(0) =='-')  || (str.charAt(0) =='+')){
            intLength++;
            sign = 1;
        }
        
        //我前面判断了是否有符号位,如果有,那么charAt(0)肯定是符号位,所有我从sign位开始判断,有符号sign=1,没有sign=0
        for (int i = sign; i < strLength; i++){
            //正则表达的是没学好,强行判断0-9(如果要判断A-Z我估计得吐血) 短路或 ||
            //如果是 0-9有效数字,有效长度+1
            if ((str.charAt(i) =='1') || (str.charAt(i) =='2') || (str.charAt(i) =='3') || (str.charAt(i) =='4') || (str.charAt(i) =='5') || (str.charAt(i) =='6') || (str.charAt(i) =='7') || (str.charAt(i) =='8') || (str.charAt(i) =='9') || (str.charAt(i) =='0')){
                intLength++;
            }else break;  //碰到第一个非有效数字的字符就跳出循环

        }
        //通过上面的循环我们已经将str里面的有效长度取出来了
        //如果没有有效数字,直接返回0
        if (intLength ==0) return 0;

        //再次裁剪,现在str生效的都是有效位了
        str = str.substring(0,intLength);
        
        //有符号且只有一位,说明仅仅是有个正负符号,返回0
        if (str.charAt(0) == '-' || str.charAt(0) == '+'){
            if (str.length() == 1) return 0;
        }
        
		//接下来的就是正常的string转int,直接调用函数
        try{
            return Integer.parseInt(str);
        }catch (NumberFormatException e){
            
            if (str.charAt(0) == '-')
                return Integer.MIN_VALUE;
            return Integer.MAX_VALUE;
        }
    }
}
																					君不见,黄河之水天上来,本来到海不复还
																					博主:五更依旧朝花落
发布了35 篇原创文章 · 获赞 19 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/m0_37628958/article/details/105294214