1、题目
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
- 读入字符串并丢弃无用的前导空格 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。
- 如果两者都不存在,则假定结果为正。 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
- 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0
- 必要时更改符号(从步骤 2 开始)。 如果整数数超过 32 位有符号整数范围 [−231, 231 − 1]
- 需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1
的整数应该被固定为 231 − 1 。 返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符 ’ ’ 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
2、解法
from re import findall
from typing import re
class Solution:
def myAtoi(self, s: str) -> int:
# a = int(''.join(filter(lambda x: x.isdigit() or x == "-", s.strip())))
# if pow(-2,31) < a < pow(2,31)-1:
# print(a)
# return a
# return a[: 2**31-1]
# 过滤符合要求的字符串 -> 字符串处理
INT_MAX = 2**31-1
INT_MIN = -2**31
s = s.lstrip() # 清除左边多余的空格
num = findall('^[+-]?\d+',s) # 匹配符合规则的字符串
print(num) # ['-234']
num = int(*num) # 由于返回的是个列表,解包并且转换成整数
return max(min(num, INT_MAX), INT_MIN) # 返回值
# 方法二
matches = re.match('[ ]*([+-]?\d+)',str)
if not matches:
return 0
res=int(matches.group(1))
return min(max(res, -2**31), 2**31-1)
class TestSolution:
def test_one(self):
b = Solution()
b.myAtoi(" -234asdf798a")
def test_two(self):
b = Solution()
b.myAtoi(" -23")
def test_three(self):
b = Solution()
b.myAtoi("4193 with words")
def test_four(self):
b = Solution()
b.myAtoi(" -+987")
3、思路
- 去除前后空格,strip()默认去除两边的空格
- 过滤符合要求的字符串。
内置函数:filter(方法,迭代器),返回迭代器
re正则匹配:re.findall(规则,字符串),返回列表
- 正则解读
re.findall('^[+-]?\d+')正则解读:
^ >> 匹配规则以什么开始, 以加号或者减号开始,
[] >> 匹配括号里的所有字符
? >> 前面的字符最多出现一次或0次,以加号或者减号开始且只出现一次
\d >> 匹配数字,跟[0-9] 相等
‘+’ >> 前面的字符必须至少出现一次(1次或多次)
matches = re.match('[ ]*([+-]?\d+)',str)
方括号:匹配空格
星号:任意字符
小括号:匹配括号内的任意正则表达式,并标识出组合的开始和结尾。
部分正则特殊字符:
特殊字符有:
\A 只匹配字符串开始
\b 匹配空字符串,但只在单词开始或结尾的位置。
\B 匹配空字符串,但 不 能在词的开头或者结尾。
\d 匹配 [0-9]
\D 匹配任何非十进制数字的字符。就是 \d 取非
\s 匹配任何Unicode空白字符
\S 匹配任何非空白字符
\w 只匹配 [a-zA-Z0-9_]
\W 非字母数字也非下划线的字符
\Z 只匹配字符串尾。
https://www.runoob.com/python/python-reg-expressions.html