LeetCode:8. 字符串转整数 (atoi)(Python 3)

这道LeetCode题目要求实现一个函数,将字符串转换为整数,考虑各种边界情况,如空值、前导空格、无效字符、符号、溢出等。在Python 3中,需要处理的特殊情况包括数字后的额外字符以及数值超出32位有符号整数范围的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

实现 atoi,将字符串转为整数。

在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。

当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。

若函数不能执行有效的转换,返回 0。

说明:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。如果数值超过可表示的范围,则返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: "42"
输出: 42

示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。

示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。

解答:

这个题就是要考虑各种边界情况

1. 空值

2. 前面带一堆空格(这里"\n","\t"什么的不算)

3. 一开始就出来无效字符

4. 没有符号

5. 有正号

6. 有负号

7. 数字后面带一堆字符(如示例3,甚至那一堆字符后面还有数字,如"9000 and 9000")

8. 溢出(然而Python并不会溢出,这是题目要求)

class Solution:
    def myAtoi(self, str):
        """
        :type str: str
        :rtype: int
        """
        # 1. 除掉空格
        # 2. 判空
        str = str.strip(" ")
        if str == "":
            return 0
        else:
            # get到第一位
            firstChar = str[0]
            # 考虑只有一位的情况
            if len(str) == 1 and str.isdecimal():
                return int(str)
            elif len(str) == 1 and not str.isdecimal():
                return 0
            secondChar = str[1]
        # 处理类似"+A"的情形
        if firstChar == '+':
            if not secondChar.isdecimal():
                return 0
        # 处理类似"-A"的情形
        elif firstChar == '-':
            if not secondChar.isdecimal():
                return 0
        # 3. 一开始就是无效字符
        elif not firstChar.isdecimal():
            return 0
        else:
            pass
        # 4. 要把后面的无效字符去掉
        validStr = self.getValidStr(str)
        # 5. 考虑溢出(幸好Python实际上没有溢出)
        intValue = int(validStr)
        if intValue < -2147483648:
            return -2147483648
        elif intValue > 2147483647:
            return 2147483647
        else:
            return intValue           
    def getValidStr(self, str):
        for i in range(1, len(str)):
            char = str[i]
            # 看见无效字符直接截断
            if not char.isdecimal():
                return str[:i]
        return str
        

 

### LeetCode8 题:字符串换为整数 (atoi) #### 解决方案概述 LeetCode8 题的目标是实现一个函数 `myAtoi(string s)`,用于将给定的字符串换为一个 32 位有符号整数。以下是解决方案的核心逻辑: 1. **去除前导空格** 使用指针或索引来跳过所有的前导空格字符。 2. **处理正负号** 如果存在 `&#39;+&#39;` 或 `&#39;-&#39;` 符号,则记录其影响,并移动指针到下一个字符位置。 3. **逐位提取数字** 对于连续的数字字符,将其化为数值形式并通过累加的方式构建最终的结果值。注意,在每次累加之前都需要检查是否会超出 32 位有符号整数的范围 `[−2&sup3;¹, 2&sup3;¹ − 1]`[^3]。 4. **边界裁剪** 当检测到即将发生溢出时,立即返回相应的边界值 `-2&sup3;¹` 或 `2&sup3;¹ - 1`。 5. **终止条件** 若当前字符不是有效的数字字符或者已经超出了有效范围,则停止进一步计算并返回已有的结果值。 下面是基于上述思路的具体 Python 实现代码: ```python class Solution: def myAtoi(self, s: str) -> int: INT_MAX = 2**31 - 1 # 上限 INT_MIN = -(2**31) # 下限 index = 0 n = len(s) # 去掉前面的空白字符 while index < n and s[index] == &#39; &#39;: index += 1 # 判断是否有正负号 sign = 1 if index < n and (s[index] == &#39;+&#39; or s[index] == &#39;-&#39;): sign = -1 if s[index] == &#39;-&#39; else 1 index += 1 result = 0 # 提取数字部分 while index < n and s[index].isdigit(): digit = ord(s[index]) - ord(&#39;0&#39;) # 将字符为对应数字 [^2] # 检查是否会发生溢出 if result > (INT_MAX - digit) // 10: return INT_MIN if sign == -1 else INT_MAX result = result * 10 + digit index += 1 return sign * result ``` --- #### 关键点分析 1. **移除前导空格** 在遍历字符串的过程中,首先忽略所有开头处的空格字符。这一步可以通过简单的循环完成。 2. **识别正负号** 正负号仅允许出现在第一个非空格字符的位置上。如果发现的是 `&#39;+&#39;` 或者 `&#39;-&#39;`,则设置标志变量 `sign` 来跟踪后续结果应乘以哪个因子(即正值还是负值)。之后继续前进至下一位字符。 3. **数字拼接与溢出控制** 数字由多个连续的阿拉伯数字组成。对于每一个合法的数字字符,先验证加入它后不会造成数据溢出;然后再执行实际的操作——将现有总和扩大十倍再加上新读入的一位数。 4. **结束判定** 如遇任何非法字符(既不为空白也不属于数字范畴),立刻中断解析过程并将目前累积得到的部分作为最后答案输出。 --- #### 示例运行情况 考虑几个典型的测试样例及其预期行为: | 输入 | 输出 | |------------------------|-----------| | `"42"` | `42` | | `" -42"` | `-42` | | `"4193 with words"` | `4193` | | `"words and 987"` | `0` | | `"-91283472332"` | `-2147483648` | 以上例子展示了不同场景下的表现如何满足题目需求以及边缘状况处理得当与否的重要性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值