当前位置: 首页 > article >正文

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

在这里插入图片描述

🚀 算法题 🚀

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

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🍔 目录

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

🚩 题目链接

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

⛲ 题目描述

请你来实现一个 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. 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
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;
    }
}
🥦 运行结果

在这里插入图片描述


💬 共勉

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

在这里插入图片描述

在这里插入图片描述


http://www.kler.cn/a/543009.html

相关文章:

  • LVS作业
  • 机器学习10-卷积和卷积核3
  • 多模态模型详解
  • 【05】RUST常用的集合函数宏类型
  • 前端实现在PDF上添加标注(1)
  • 在npm上传属于自己的包
  • docker 运行NVIDIA并启动cuda
  • 2.11学习记录
  • 【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA
  • PostgreSQL错误: 编码“UTF8“的字符0x0xe9 0x94 0x99在编码“WIN1252“没有相对应值
  • 【EXCEL】【VBA】最大值行索引查找与Z字形数据重排
  • kamailio关于via那点事
  • 将 AMD Zynq™ RFSoC 扩展到毫米波领域
  • 软件工程-决策树决策表
  • Unity 打造游戏资源加密解密系统详解
  • ElementUI的<el-image>组件引用网络图片加载失败
  • 从词袋到Transformer:自然语言处理的演进与实战
  • Maven 多模块项目管理
  • 回溯---相关习题,经验总结
  • DeepSeek-V2 论文解读:混合专家架构的新突破
  • 青少年编程与数学 02-009 Django 5 Web 编程 07课题、数据迁移
  • 从零构建高可用MySQL集群:Percona XtraDB Cluster 实战部署
  • 《qt open3d中添加最远点采样》
  • STM32 如何将printf函数和串口函数重定向
  • Redis主从复制高延迟问题解决思路
  • 【Elasticsearch】Bucket Selector Aggregation