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

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

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。

函数 myAtoi(string s) 的算法如下:

1.空格:读入字符串并丢弃无用的前导空格(" "
2.符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。
3.转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
4.舍入:如果整数数超过 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)、' ''+''-' '.'组成

代码:

class Solution:
    def myAtoi(self, s: str) -> int:
        s = s.strip()                      # 删除首尾空格
        if not s: return 0                   # 字符串为空则直接返回
        res, i, sign = 0, 1, 1
        int_max, int_min, bndry = 2 ** 31 - 1, -2 ** 31, 2 ** 31 // 10
        if s[0] == '-': sign = -1            # 保存负号
        elif s[0] != '+': i = 0              # 若无符号位,则需从 i = 0 开始数字拼接
        for c in s[i:]:
            if not '0' <= c <= '9' : break     # 遇到非数字的字符则跳出
            if res > bndry or res == bndry and c > '7': return int_max if sign == 1 else int_min # 数字越界处理
            res = 10 * res + ord(c) - ord('0') # 数字拼接
        return sign * resclass Solution:
    def myAtoi(self, s: str) -> int:
        s = s.strip()  # 删除字符串首尾的空格
        if not s:  # 如果字符串为空,则返回0
            return 0
        res, i, sign = 0, 1, 1  # 初始化结果res为0,索引i为1(因为要跳过可能的符号位),符号sign为1(正号)
        int_max, int_min, bndry = 2 ** 31 - 1, -2 ** 31, 2 ** 31 // 10  # 定义整数的最大值和最小值,以及边界值
        if s[0] == '-':  # 如果字符串的第一个字符是负号
            sign = -1  # 设置符号为负
        elif s[0] != '+':  # 如果字符串的第一个字符不是正号
            i = 0  # 从索引0开始处理数字
        for c in s[i:]:  # 遍历字符串,从索引i开始
            if not '0' <= c <= '9' :  # 如果当前字符不是数字,则跳出循环
                break
            if res > bndry or (res == bndry and c > '7'):  # 如果当前结果已经超过边界值或者等于边界值且下一个字符大于'7'
                return int_max if sign == 1 else int_min  # 根据符号返回最大值或最小值
            res = 10 * res + ord(c) - ord('0')  # 将当前结果乘以10,然后加上当前字符代表的数字(通过ord函数获取字符的ASCII码,然后减去'0'的ASCII码)
        return sign * res  # 返回最终结果,乘以符号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值