您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 使用LeetCode怎么将字符串转换成整数
## 引言
在编程面试和算法练习中,字符串到整数的转换(String to Integer, atoi)是一个经典问题。LeetCode平台上也有对应的题目([第8题](https://leetcode.com/problems/string-to-integer-atoi/)),考察开发者对边界条件、异常处理和算法效率的把握。本文将详细解析如何用Python、Java和C++实现这一功能,并分析关键解题思路。
---
## 问题描述
题目要求实现一个类似C/C++中`atoi`的函数,将字符串转换为32位有符号整数。具体规则包括:
1. **忽略前导空格**:跳过字符串开头的所有空格字符。
2. **处理正负号**:可能以`+`或`-`开头。
3. **读取数字**:直到遇到第一个非数字字符为止。
4. **范围限制**:结果必须在`[−2³¹, 2³¹ − 1]`范围内,超出时返回边界值。
5. **无效输入**:如果无法转换,返回0。
示例:
输入: “ -42” 输出: -42
输入: “4193 with words” 输出: 4193
---
## 解题思路
### 关键步骤分解
1. **去除前导空格**
使用语言内置的`trim()`或手动跳过空格字符。
2. **处理符号位**
检查第一个非空格字符是否为`+`或`-`,并记录正负。
3. **逐字符转换数字**
从第一个数字字符开始,依次计算数值:
`num = num * 10 + (current_char - '0')`
4. **处理溢出**
在每次计算后检查是否超出32位整数范围。
5. **提前终止条件**
遇到非数字字符立即停止转换。
---
## 代码实现
### Python版本
```python
class Solution:
def myAtoi(self, s: str) -> int:
s = s.lstrip() # 去除前导空格
if not s:
return 0
sign = 1
index = 0
if s[index] in '+-':
sign = -1 if s[index] == '-' else 1
index += 1
num = 0
while index < len(s) and s[index].isdigit():
digit = int(s[index])
# 检查溢出
if num > (2**31 - 1 - digit) // 10:
return 2**31 - 1 if sign == 1 else -2**31
num = num * 10 + digit
index += 1
return sign * num
public class Solution {
public int myAtoi(String s) {
s = s.trim();
if (s.isEmpty()) return 0;
int sign = 1, i = 0;
if (s.charAt(0) == '-') {
sign = -1;
i++;
} else if (s.charAt(0) == '+') {
i++;
}
long num = 0;
while (i < s.length() && Character.isDigit(s.charAt(i))) {
num = num * 10 + (s.charAt(i) - '0');
if (num * sign > Integer.MAX_VALUE) return Integer.MAX_VALUE;
if (num * sign < Integer.MIN_VALUE) return Integer.MIN_VALUE;
i++;
}
return (int) num * sign;
}
}
class Solution {
public:
int myAtoi(string s) {
int i = 0, sign = 1;
long num = 0;
while (s[i] == ' ') i++; // 跳过空格
if (s[i] == '-' || s[i] == '+') {
sign = (s[i++] == '-') ? -1 : 1;
}
while (isdigit(s[i])) {
num = num * 10 + (s[i] - '0');
if (num * sign > INT_MAX) return INT_MAX;
if (num * sign < INT_MIN) return INT_MIN;
i++;
}
return num * sign;
}
};
""
→ 0
" +123"
→ 123
"2147483648"
→ 2147483647
(INT_MAX)"123abc"
→ 123
print(Solution().myAtoi("42")) # 42
print(Solution().myAtoi(" -42")) # -42
print(Solution().myAtoi("4193 with")) # 4193
print(Solution().myAtoi("words 987")) # 0
通过逐步处理前导空格、符号位、数字转换和溢出检查,可以高效解决字符串转整数问题。LeetCode此题不仅考察基础编码能力,更注重对细节和异常场景的处理。建议读者自行实现后提交验证,加深理解。
提示:实际面试中,面试官可能会要求解释为何选择
// 10
而不是直接比较,或讨论其他优化方法。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。