LC 字符串转换整数 (atoi)

x33g5p2x  于11个月前 转载在 其他  
字(1.1k)|赞(0)|评价(0)|浏览(119)

LC 字符串转换整数

2021.09.17 民主楼


请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

  • 读入字符串并丢弃无用的前导空格
  • 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  • 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  • 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  • 如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
  • 返回整数作为最终结果。

注意:

  • 本题中的空白字符只包括空格字符 ’ ’ 。
  • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

【代码1.0】

class Solution {
    public int myAtoi(String s) {
        String s1 = s.trim();//丢弃无用的前导空格
        int length = s1.length();

        if (length == 0)     //空字符返回0
            return 0;

        int i = 0;          // 遍历用的index
        byte flag = 1;      //正负号标志位

        if (s1.charAt(0) == '-')    //如果有正负号,后面就不用遍历 i=0了,直接从 i=1 开始
        {
            flag = -1;
            i = 1;
        }
        else if ( s1.charAt(0) == '+')
            i = 1;

        long sum = 0;       //因为题目有范围限制,刚好是 int 的范围,所以选用 long

        if (i > length - 1 && !Character.isDigit(s1.charAt(0)))  //i=0不是数字 且 越界了就直接返回0
            return 0;

        while (Character.isDigit(s1.charAt(i)))
        {
            sum = sum*10 + flag*((int)(s1.charAt(i)) - 48); //0的ASCII码 48
            //解决边界问题
            if (sum >=Integer.MAX_VALUE)
                return  Integer.MAX_VALUE;
            else if (sum <=Integer.MIN_VALUE)
                return Integer.MIN_VALUE;

            if (++i > length - 1) //越界后及时退出
                break;
        }
        return (int)sum;
    }
}

在这里插入图片描述

相关文章