天天看点

力扣(leetcode) 8. 字符串转换整数 (atoi)(普通法)(正则一行代码法)

题目在这​​:https://leetcode-cn.com/problems/string-to-integer-atoi/​​

思路分析:

str类型变int类型问题。

这一题题目看上去挺多,不过就那么几个要求。

1.字符串前面空格不要

2.只要开头的连续数字(不算正负号)

3.范围在[-231, 231 - 1]之间

4.没有读入数字则为0

按照上面的步骤来写就很容易了。

法一:

= ''
    s = s.strip() # 去掉前后的空格,准确的可以写lstrip
    if len(s) == 0: # 字符串内没有字符时,返回0
        return 0
    if not  s[0].isnumeric() and s[0] != '+' and s[0] != '-': # 第一位非数字 和加减号
        return 0
    if s[0] == '+' or s[0] == '-': # 第一位带符号
        temp = s[0] # 吧符号存到temp里
        s = s[1:]  # 去掉符号
    for i in range(0,len(s)):
        if not s[i].isnumeric(): # 非数字
            s = s[:i] # 只要带数字的部分
            break
    if s == '':  # 若 切割后为空
        return 0
    s = temp + s # 带上正负号 判断范围
    if int(s) <= -2 ** 31:
        return -2 ** 31
    elif  int(s) >= 2 ** 31 -1:
        return 2 ** 31 -1
    else:
        return int(s)

    return int(s)      

法二

使用正则表达式解决问题,压缩到只需要一行代码。

s = max(min(int(*re.findall('^[+|-]?\d+',s.strip())),2 ** 31 -1),-2 ** 31)      

正则表达式 : ​

​^[+|-]?\d+​

  • .​

    ​^ 表示从头开始匹配​

  • .​

    ​[+|-]​

    ​​

    ​表示可以是加号或者减号​

  • .​

    ​? 表示可以为0个或者1个​

  • ​\d 表示为数字​

  • .​

    ​+表示可以有一个或者多个​

re前面的星号,就是把正则返回来的列表 拆包变成int。

例如:

s=['422']
print(*s) 输出422      
= ['a','b','c']
B = [1,2,3,4,5]
for i in zip(A,B):
    print(i)
    输出
('a', 1)
('b', 2)
('c', 3)