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 # 返回最终结果,乘以符号