目录
1.题目描述
请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数。
函数 myAtoi(string s)
的算法如下:
- 空格:读入字符串并丢弃无用的前导空格(
" "
) - 符号:检查下一个字符(假设还未到字符末尾)为
'-'
还是'+'
。如果两者都不存在,则假定结果为正。 - 转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
- 舍入:如果整数数超过 32 位有符号整数范围
[−231, 231 − 1]
,需要截断这个整数,使其保持在这个范围内。具体来说,小于−231
的整数应该被舍入为−231
,大于231 − 1
的整数应该被舍入为231 − 1
。
返回整数作为最终结果。
2.题目分析
- 在转换数字时,我们需要检查整数溢出的情况。Python的
int
类型可以处理很大的数,但题目可能要求我们在没有使用int
类型的情况下模拟这个过程。 - 当我们遇到第一个非数字字符时,我们应该停止转换并返回当前的结果。
- 我们需要分别处理正数和负数的溢出情况。注意,负数的最小值比正数的最大值多一个数(即-2^31),所以在检查负数溢出时,我们需要稍微调整条件。
- 最后,返回结果时,我们需要乘以符号
flag
。
3.代码实现
class Solution:
def myAtoi(self, s: str) -> int:
i = 0
n = len(s)
# 跳过前导空格
while i < n and s[i] == ' ':
i += 1
# 如果字符串为空或只有空格,返回0
if i == n:
return 0
# 初始化符号
flag = 1
# 判断正负号
if s[i] == '-':
flag = -1
i += 1
elif s[i] == '+':
i += 1
# 初始化结果并转换数字
ans = 0
while i < n and '0' <= s[i] <= '9':
# 在这里需要处理整数溢出的情况
# Python的int类型可以处理很大的数,但为了题目要求,我们仍然需要模拟这个过程
if ans > (2**31 - 1) // 10 or (ans == (2**31 - 1) // 10 and int(s[i]) > 7):
# 如果为正数且溢出,返回最大值
return 2**31 - 1 if flag > 0 else -2**31
if ans < -(2**31) // 10 or (ans == -(2**31) // 10 and int(s[i]) > 8):
# 如果为负数且溢出,返回最小值
return -2**31
# 更新结果
ans = ans * 10 + int(s[i])
i += 1
# 返回最终结果,考虑符号
return ans * flag