初级算法_字符串 --- 字符串转换整数 (atoi)

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、思路

  1. 去除前后空格,strip()默认去除两边的空格
  2. 过滤符合要求的字符串。

内置函数:filter(方法,迭代器),返回迭代器
re正则匹配:re.findall(规则,字符串),返回列表

  1. 正则解读
    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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_焦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值