一. 题目
- 题目
- 示例
二. 方法一: 暴力
-
解题思路
本题解题思路比较简单, 但是要考虑的情况比较多, 我也是多次提交才把所有情况考虑周全,
具体情况在代码中标注出来了 -
解题代码
def myAtoi(self, s: str) -> int: # 去掉字符串左侧的所有空格 str1 = s.lstrip() # 如果str1为空, 直接返回0, 如果不进行处理, 后面取第一个元素时还会报异常 if not str1: return 0 # 如果str1的长度为1, 并且是"+" 或 "-"这两个值, 则直接返回0 if len(str1) == 1 and (str1[0] == '-' or str1[0] == '+'): return 0 # 将0 - 9 这10个字符放在列表中, 用于后续的判断 list1 = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] # 如果str1第一个字符不是数字, "+"和"-", 则表示以字母开头, 直接返回0 if (str1[0] not in list1) and (str1[0] != '-') and (str1[0] != '+'): return 0 else: # 将第一个字符保存到str2中, 可能是数字或者"+"和"-" str2 = str1[0] # 从第二个字符开始遍历, 如果是数字的字符就加入到str2中, 直到遇到非数字的字符 for i in range(1, len(str1)): if str1[i] in list1: str2 += str1[i] else: break # 如果str2长度为1, 并且是"+" 或者 "-", 则返回0 if len(str2) == 1 and str2[0] not in list1: return 0 num = int(str2) # 超过范围需要处理 if num > 2 ** 31 - 1: return 2 ** 31 - 1 elif num < -2 ** 31: return -2 ** 31 else: return num
-
分析
时间复杂度: O(n)
可架构在的: O(1)
三. 方法二: 自动机(官方)
后续再看题解,
四. 方法三: 正则表达式(拓展)
-
解题思路
运用正则表达式写出满足题解的规则, 然后返回即可 -
解题代码
import re def myAtoi(self, s: str) -> int: int_max = 2 ** 31 - 1 int_min = - 2 ** 31 str1 = s.lstrip() # 设置正则规则 num_re = re.compile(r'^[\+\-]?\d+') # 查找匹配的内容 num = num_re.findall(str1) # 由于返回的是个列表,解包并且转换成整数 num = int(*num) return max(min(num, int_max), int_min)
-
分析