8. String to Integer (atoi) 字符串转为int类型的所有可能情况

8. String to Integer (atoi)

问题:

输入一个字符串,将字符串转为int类型,处理所有可能的输入情况。

这里写图片描述

可能的输入情况:

1.字符串为空。即“”。

2.首先是假设输入的字符串都是数字型的,可含正负号,例如12345,+12548,-15568。

3.字符串中含有非数字的其他字符类型,例如a,-sd,-1286dgg558,000822fg55。

4.字符串首尾含有空格的,例如 -558dg12, 12dc12 。

5.针对转换后的数字越界,有两种情况,一个是超过int型的表示范围,一个是超过long型的表示范围。

自己写的:(java)

public class Solution {
    public int myAtoi(String str) {
        //4、处理带空格的情况,将所有首尾空格先删掉
        str=str.trim();
        char[] charSplitArray = str.toCharArray();
        int result = 0;
        //1、处理字符串为空的情况,直接返回0
        if (str.equals("")) {
            return result;
        }
        //2、带符号的情况判断。判断第一个位置是不是符号。是符号且长度大于1,则继续,不是符号且非数字,或者是符号但是长度为1,直接return 0.
        int intLetter = (int)charSplitArray[0];
        if (charSplitArray.length==1 && (intLetter < 48 || intLetter > 57) ) {
           return 0;
        }
        //针对带符号类型和不带符号类型分别处理。
        if (intLetter==45 || intLetter==43) {
            result = positiveNum(charSplitArray,1,str,intLetter);
            System.out.println(result);
        }
        else {
            result = positiveNum(charSplitArray,0,str,0);
        }
        return result;
    }

    //对不带符号的统一处理逻辑。
    public int positiveNum(char[] charArray,int startIndex,String strPos,int symbolTag) {
        int resultPos = 0;
        for (int i=startIndex; iint intLetter = (int)charArray[i];
            //如果符号后面跟的不是数字,则不能转换
            if ((intLetter < 48 || intLetter > 57) && i==startIndex) {
                return 0;
            }
            //3、处理字符串中含有非数字的其他字符类型。例如“  -0023asd23”
            if ((intLetter < 48 || intLetter > 57)) {
                strPos = String.copyValueOf(charArray,startIndex,i-startIndex);
                //5、判断超出long型的数据。
                if (i-startIndex > 18) {
                    if (symbolTag == 45) {
                        return -2147483648;
                    }else {
                        return 2147483647;
                    }
                }
                break;
            }
            //符号后面全为数字时
            if ((intLetter >= 48 && intLetter <= 57 && i==charArray.length-1)) {
                strPos = String.copyValueOf(charArray,startIndex,i-startIndex+1);
            }
            //5、判断超出long型的数据。
            if (charArray.length > 18) {
                if (symbolTag == 45) {
                    return -2147483648;
                }else {
                    return 2147483647;
                }
            }
        }
        long longResult=Long.parseLong(strPos);
        if (symbolTag==45) {
            longResult = 0-longResult;
        }
        //5、判断超出int型的数据。
        if (longResult > 2147483647) {
            resultPos = 2147483647;
        }
        else if (longResult < -2147483648) {
            resultPos = -2147483648;
        }
        else {
            resultPos = new Long(longResult).intValue();  
        }
        return resultPos; 
    }
}

思路:
1、首先清除字符串首尾的空格。

2、判断字符串是否为空,为空则直接返回0。

3、判断是否存在符号,首先将“-”这种仅含有符号的字符串直接排除返回0。则还存在三种情况,例如”+2232”这种带有正号的字符串;”-1”这种带有负号的字符串,以及”23”这种不带有符号的字符串。

4、将所有带符号的字符串先去掉符号,和不带符号的字符串统一通过positiveNum函数进行处理。传入参数有,字符数组,处理起始位置(有符号时传入数值为1,无符号时为0),字符串,符号位判断(传入第一位的ascii码值)。这里分析的是positiveNum函数的处理逻辑,判断的情况有:(1)符号后面一位,这里就直接是处理起始位置(传入的参数)不是数字,例如”-a”,直接返回0。(2)字符串中含有非数字类型,例如“23as12”,则遇到非数字类型时就要只取前面的数字类型,将后面全部舍弃,处理完转换为long型之前,需要判断是否会越界。(3)字符串中全部为数字类型,在转换为long型之前需要判断是否越界。

5、将处理后的字符串转换为long型,通过传入参数判断字符数组第一位是否为负号,为负号则在long型数据上加上负号。

6、判断数据是否超出int型,超出则直接处理,未超出则转为int型。

代码精简版:

。。。

你可能感兴趣的:(leetcode,string,int,类型转换,java,leetcode)