leetcode笔记总结——(3)字符串转换整数 (atoi)(python实现)

1、题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、思路

我自己的思路就是使用多个if-else判断,虽然能解决,但是代码既难看又冗余,把自己的代码贴在下面,方便以后查看:

class Solution:
    def myAtoi(self, s: str) -> int:
        if len(s) == 0:
            return 0

        flag = False # 是否是负数,默认是正数
        for index in range(len(s)): # 寻找前导空格下标
            if s[index]!=' ':
                break
        if s[index] in '0123456789-+': # 判断第一个非空格字符串是否是负号
            if s[index]=='-':
                flag = True
                index += 1
            elif s[index]=='+':
                index += 1
        else:
            return 0
        
        save_str = ''
        while index < len(s) and s[index] in '0123456789': # 取数字
            save_str += s[index]
            index += 1
        if len(save_str) != 0:
            save_num = int(save_str) # 转换为整数
        else:
            return 0

        if flag:
            save_num = 0 - save_num
        
        if -2**31 > save_num:
            return -2**31
        elif 2**31 - 1 < save_num:
            return 2**31 - 1
        else:
            return save_num

在这里插入图片描述
但是看了人家使用python解决的代码,就一行。。。。。。。

使用了正则表达式。直接看代码:

3、python代码实现

class Solution:
    def myAtoi(self, s: str) -> int:
        return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), 2**31 - 1), -2**31)

解释:

^:匹配字符串开头
[\+\-]:代表一个+字符或-字符
?:前面一个字符可有可无
\d:一个数字
+:前面一个字符的一个或多个
\D:一个非数字字符
*:前面一个字符的0个或多个

max(min(数字, 2**31 - 1), -2**31) 用来防止结果越界

s.lstrip()在不传参数的情况下,默认截取掉了左边的空格。


为什么可以使用正则表达式?如果整数过大溢出怎么办?

题目中描述: 假设我们的环境只能存储 32 位大小的有符号整数

首先,这个假设对于 Python 不成立,Python 不存在 32 位的 int 类型。其次,即使搜索到的字符串转32位整数可能导致溢出,我们也可以直接通过字符串判断是否存在溢出的情况(比如 try 函数 或 判断字符串长度 + 字符串比较)。


补充:

re.findall() 没有匹配时返回[],否则返回全部符合该正则的子字符串;在这里因为输入只有一行,所以结果只能是空列表或者长度为1的列表
* 用来解包,也就是把列表展开。如要将[123]——>123,可以int(*[123])
int() 在输入为空的情况下,会返回0。(也就是说能够处理空列表展开的情况)

4、运行结果:

在这里插入图片描述

5、总结:

(1)

re.findall(pattern, string, flags=0)

作用:
返回string中所有与pattern匹配的全部字符串,返回形式为数组

(2)Python 解包骚操作"*"

https://zhuanlan.zhihu.com/p/41968260

(3)lstrip()

s.lstrip()在不传参数的情况下,默认截取掉了左边的空格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值