![](https://i-blog.csdnimg.cn/blog_migrate/8a55cdb884ec56adb4fa0ad510750bc2.gif)
|-----------|
| 🚀 算法题 🚀 |
🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,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)、' '、'+'、'-' 和 '.' 组成
🌟 求解思路&实现代码&运行结果
⚡ 模拟
🥦 求解思路
- 处理空白字符:跳过字符串开头的所有空白字符(如空格、制表符等)。
- 处理正负号:读取可选的正负号,并记录符号。
- 读取数字:从第一个非空白字符开始,读取连续的数字字符,并将其转换为整数。
- 处理溢出:在转换过程中,检查是否超出 32 位有符号整数范围。如果超出,则返回边界值。
- 返回结果:根据符号返回最终的整数。
- 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
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;
}
}
🥦 运行结果
![](https://i-blog.csdnimg.cn/direct/5831cbf0acb1488bae27e521fbce43cc.png)
💬 共勉
|----------------------------------|
| 最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |
![](https://i-blog.csdnimg.cn/blog_migrate/bdec3ee0c04595ed0885f243b48d0d48.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4ea52b848c66d92ca405a31e7090c1fa.gif)