使用LeetCode怎么将字符串转换成整数

发布时间:2021-08-02 16:29:55 作者:Leah
来源:亿速云 阅读:156
# 使用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

Java版本

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;
    }
}

C++版本

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;
    }
};

边界条件与测试案例

必须考虑的边界情况

  1. 空字符串或全空格""0
  2. 前导空格与符号组合" +123"123
  3. 溢出处理"2147483648"2147483647(INT_MAX)
  4. 非数字字符中断"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而不是直接比较,或讨论其他优化方法。 “`

推荐阅读:
  1. leetcode--整数反转
  2. 将字符串转换成整数(atoi的实现)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

leetcode

上一篇:代理ip怎么实现查询信息

下一篇:golang中怎么利用leetcode表示数值的字符串

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》