• 《算法通关村——不简单的字符串转换问题》


    《算法通关村——不简单的字符串转换问题》

    8. 字符串转换整数 (atoi)

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

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

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

    注意:

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

    示例 1:

    输入:s = "42"
    输出:42
    解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
    第 1 步:"42"(当前没有读入字符,因为没有前导空格)
             ^
    第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
             ^
    第 3 步:"42"(读入 "42")
               ^
    解析得到整数 42 。
    由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    示例 2:

    输入:s = "   -42"
    输出:-42
    解释:
    第 1 步:"   -42"(读入前导空格,但忽视掉)
                ^
    第 2 步:"   -42"(读入 '-' 字符,所以结果应该是负数)
                 ^
    第 3 步:"   -42"(读入 "42")
                   ^
    解析得到整数 -42 。
    由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    示例 3:

    输入:s = "4193 with words"
    输出:4193
    解释:
    第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格)
             ^
    第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
             ^
    第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止)
                 ^
    解析得到整数 4193 。
    由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    提示:

    • 0 <= s.length <= 200
    • s 由英文字母(大写和小写)、数字(0-9)、' ''+''-''.' 组成

    题解

    public static int myAtoi(String str) {
            int len = str.length();
            char[] charArray = str.toCharArray();
    
            // 1、去除前导空格
            int index = 0;
            while (index < len && charArray[index] == ' ') {
                index++;
            }
    
            // 2、如果已经遍历完成(针对极端用例 "      ")
            if (index == len) {
                return 0;
            }
    
            // 3、如果出现符号字符,仅第 1 个有效,并记录正负
            int sign = 1;
            char firstChar = charArray[index];
            if (firstChar == '+') {
                index++;
            } else if (firstChar == '-') {
                index++;
                sign = -1;
            }
    
            // 4、将后续出现的数字字符进行转换
            // 不能使用 long 类型,这是题目说的
            int res = 0;
            while (index < len) {
                char currChar = charArray[index];
                // 4.1 先判断不合法的情况
                if (currChar > '9' || currChar < '0') {
                    break;
                }
    
                // 题目中说只能存储 32 位大小的有符号整数,下面两个if分别处理整数和负数的情况。
                // 提前判断乘以10以后是否越界,但res*10可能会越界,所以这里使用Integer.MAX_VALUE/10,这样一定不会越界。
                // 这是解决溢出问题的经典处理方式
                if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (currChar - '0') > Integer.MAX_VALUE % 10)) {
                    return Integer.MAX_VALUE;
                }
                if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (currChar - '0') > -(Integer.MIN_VALUE % 10))) {
                    return Integer.MIN_VALUE;
                }
    
                // 合法的情况下,才考虑转换,每一步都把符号位乘进去
                // 想想这里为什么要带着sign乘
                res = res * 10 + sign * (currChar - '0');
                index++;
            }
            return res;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

    也可以加我QQ(2837468248)咨询说明来意!

  • 相关阅读:
    认识并安装WSL
    LM224ADT运算放大器芯片中文资料规格书产品文档PDF数据手册引脚图参数价格
    MySQL内置函数
    肖sir ——自动化讲解
    【ACWing】1176. 消息的传递
    PLC中获取输入信号上升沿或下降沿的具体方法示例
    MATLAB | 好看的相关系数矩阵图绘制
    Hadoop (十五) --------- Hadoop 数据压缩
    训练第一个MMClassification模型
    【网工日常】Web网管及注意事项
  • 原文地址:https://blog.csdn.net/Go_ahead_forever/article/details/134484656