【LeetCode: 8. 字符串转换整数 (atoi) + 模拟】

|-----------|
| 🚀 算法题 🚀 |

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

|-----------|
| 🚀 算法题 🚀 |


🍔 目录

    • [🚩 题目链接](#🚩 题目链接)
    • [⛲ 题目描述](#⛲ 题目描述)
    • [🌟 求解思路&实现代码&运行结果](#🌟 求解思路&实现代码&运行结果)
      • [⚡ 模拟](#⚡ 模拟)
        • [🥦 求解思路](#🥦 求解思路)
        • [🥦 实现代码](#🥦 实现代码)
        • [🥦 运行结果](#🥦 运行结果)
    • [💬 共勉](#💬 共勉)

🚩 题目链接

⛲ 题目描述

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

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

  • 空格:读入字符串并丢弃无用的前导空格(" ")
  • 符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。
  • 转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
  • 舍入:如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。
    返回整数作为最终结果。

示例 1:

输入:s = "42"

输出:42

解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。

带下划线线的字符是所读的内容,插入符号是当前读入位置。

第 1 步:"42"(当前没有读入字符,因为没有前导空格)

^

第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')

^

第 3 步:"42"(读入 "42")

^

示例 2:

输入:s = " -042"

输出:-42

解释:

第 1 步:" -042"(读入前导空格,但忽视掉)

^

第 2 步:" -042"(读入 '-' 字符,所以结果应该是负数)

^

第 3 步:" -042"(读入 "042",在结果中忽略前导零)

^

示例 3:

输入:s = "1337c0d3"

输出:1337

解释:

第 1 步:"1337c0d3"(当前没有读入字符,因为没有前导空格)

^

第 2 步:"1337c0d3"(当前没有读入字符,因为这里不存在 '-' 或者 '+')

^

第 3 步:"1337c0d3"(读入 "1337";由于下一个字符不是一个数字,所以读入停止)

^

示例 4:

输入:s = "0-1"

输出:0

解释:

第 1 步:"0-1" (当前没有读入字符,因为没有前导空格)

^

第 2 步:"0-1" (当前没有读入字符,因为这里不存在 '-' 或者 '+')

^

第 3 步:"0-1" (读入 "0";由于下一个字符不是一个数字,所以读入停止)

^

示例 5:

输入:s = "words and 987"

输出:0

解释:

读取在第一个非数字字符"w"处停止。

提示:

0 <= s.length <= 200

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

🌟 求解思路&实现代码&运行结果


⚡ 模拟

🥦 求解思路
  1. 处理空白字符:跳过字符串开头的所有空白字符(如空格、制表符等)。
  2. 处理正负号:读取可选的正负号,并记录符号。
  3. 读取数字:从第一个非空白字符开始,读取连续的数字字符,并将其转换为整数。
  4. 处理溢出:在转换过程中,检查是否超出 32 位有符号整数范围。如果超出,则返回边界值。
  5. 返回结果:根据符号返回最终的整数。
  6. 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
java 复制代码
class Solution {
    public int myAtoi(String s) {
        if (s == null || s.length() == 0) {
            return 0; // 空字符串直接返回 0
        }

        int index = 0; // 当前字符的索引
        int sign = 1; // 符号,默认为正
        int result = 0; // 转换结果

        // 1. 跳过空白字符
        while (index < s.length() && s.charAt(index) == ' ') {
            index++;
        }

        // 2. 处理正负号
        if (index < s.length() && (s.charAt(index) == '+' || s.charAt(index) == '-')) {
            sign = s.charAt(index) == '-' ? -1 : 1;
            index++;
        }

        // 3. 读取数字字符
        while (index < s.length() && Character.isDigit(s.charAt(index))) {
            int digit = s.charAt(index) - '0'; // 当前字符对应的数字

            // 4. 处理溢出
            if (result > Integer.MAX_VALUE / 10 || 
                (result == Integer.MAX_VALUE / 10 && digit > Integer.MAX_VALUE % 10)) {
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }

            result = result * 10 + digit; // 更新结果
            index++; // 移动到下一个字符
        }

        // 5. 返回结果
        return sign * result;
    }
}
🥦 运行结果

💬 共勉

|----------------------------------|
| 最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |

相关推荐
oioihoii12 分钟前
深入解析 C++20 中的 std::bind_front:高效函数绑定与参数前置
java·算法·c++20
码递夫21 分钟前
[NO-WX179]基于springboot+微信小程序的在线选课系统
java·spring boot·后端·微信小程序
magic 24523 分钟前
Servlet-http协议、模版方法设计模式、HttpServlet源码分析
java·servlet·tomcat·html·intellij-idea
blammmp26 分钟前
Java EE 进阶:MyBatis-plus
java·java-ee·mybatis
程序员yt27 分钟前
双非一本Java方向,学完感觉Java技术含量不高,考研换方向如何选择?
java·开发语言·考研
MobiCetus39 分钟前
如何一键安装所有Python项目的依赖!
开发语言·jvm·c++·人工智能·python·算法·机器学习
凌冰_41 分钟前
Java 集合中ArrayList与LinkedList的性能比较
java·开发语言
思麟呀43 分钟前
String类的模拟实现
开发语言·c++·算法
程序猿chen1 小时前
第二重·腾挪篇:云原生轻功身法要诀
java·git·后端·程序人生·云原生·java-ee·github
快来卷java1 小时前
优化MyBatis-Plus批量插入策略
java·windows·spring·tomcat·maven·mybatis