【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;
    }
}
🥦 运行结果

💬 共勉

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

相关推荐
道友老李9 分钟前
【Java】多线程和高并发编程(四):阻塞队列(上)基础概念、ArrayBlockingQueue
java·系统架构
API快乐传递者1 小时前
Java爬虫:打造高效的数据抓取利器——详解详情接口设计与实现
java·开发语言·爬虫
Ring__Rain1 小时前
c版的findcontours改写,输出为vector<vector<cPoint>>
算法
Yoyo25年秋招冲冲冲1 小时前
Day60_补20250208_图论part5_并查集理论基础|寻找存在的路径
java·开发语言·数据结构·算法·leetcode·动态规划·图论
_平凡之路_1 小时前
实现限制同一个账号最多只能在3个客户端(有电脑、手机等)登录(附关键源码)
android·java·vue.js·spring·servlet
magic 2451 小时前
JUnit5 单元测试详解
java·开发语言·单元测试·junit 5
不会敲代码的狗2 小时前
Acwing-基础算法课笔记之基础算法(差分)
笔记·算法
阿猿收手吧!2 小时前
【面试】面试常见的智力题
面试·职场和发展
rain雨雨编程2 小时前
黑马Redis详细笔记(实战篇---短信登录)
java·redis·缓存·框架·短信登录