剑指 Offer 20. 表示数值的字符串-Python题解

转载
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。

状态迁移图:
在这里插入图片描述

class Solution:
    def isNumber(self, s: str) -> bool:
        # 有限状态机进行解答
        # 由不同的触发,可以迁移到对应的状态
        states = [
            {' ':0, 's':1, 'd':2, '.':4},  # 状态0:起始的空格
            {'d':2, '.':4}, # 状态1:空格后的正负号
            {'d':2, '.':3, 'e':5, ' ':8}, # 状态2:正负号后的数字
            {'d':3, 'e':5, ' ':8}, # 状态3:小数点前是数字,表示该小数点
            {'d':3}, # 状态4:小数点前是空格时,表示该小数点
            {'s':6, 'd':7}, # 状态5:幂符号,幂符号前可以是小数点么?
            {'d':7}, # 状态6:幂符号后的正负号
            {'d':7, ' ':8}, # 状态7:幂符号后的数字
            {' ':8} # 状态8:结尾后的空格
        ]

        # alias是部分符号的别名
        alias = ''
        # 当前所处的状态数字代号, 状态0是起始状态
        state_num = 0
        for item in s:
            # + - 符号的别名为s
            if item in ('+-'):
                alias = 's'
            # 空格 e . 符号的别名为本身
            elif item in (' e.'):
                alias = item
            # 数字 0-9 符号的别名是 d
            elif item >= '0' and item <= '9':
                alias = 'd'
            # 如果不是上面指定字符,则认为掺入了异常字符,直接返回False
            else:
                return False
            # 如果该触发条件不是当前状态的触发条件,则直接返回False
            if alias not in states[state_num]:
                return False

            # 将该触发条件发生后,状态迁移后的状态代号
            state_num = states[state_num][alias]
        # 2,3,7,8状态都可以认为是结束状态
        return state_num in (2, 3, 7, 8)
        
                

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值