当前位置: 首页 > article >正文

Leetcode 65. 有效数字

1.题目基本信息

1.1.题目描述

给定一个字符串 s ,返回 s 是否是一个 有效数字。

例如,下面的都是有效数字:”2″, “0089”, “-0.1”, “+3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e+7”, “+6e-1”, “53.5e93”, “-123.456e789″,而接下来的不是:”abc”, “1a”, “1e”, “e3”, “99e2.5”, “–6”, “-+3”, “95a54e53″。

一般的,一个 有效数字 可以用以下的规则之一定义:

  • 一个 整数 后面跟着一个 可选指数。
  • 一个 十进制数 后面跟着一个 可选指数。
    一个 整数 定义为一个 可选符号 ‘-‘ 或 ‘+’ 后面跟着 数字。

一个 十进制数 定义为一个 可选符号 ‘-‘ 或 ‘+’ 后面跟着下述规则:

  • 数字 后跟着一个 小数点 .。
  • 数字 后跟着一个 小数点 . 再跟着 数位。
  • 一个 小数点 . 后跟着 数位。

指数 定义为指数符号 ‘e’ 或 ‘E’,后面跟着一个 整数。

数字 定义为一个或多个数位。

1.2.题目地址

https://leetcode.cn/problems/valid-number/description

2.解题方法

2.1.解题思路

状态机; 关键: 状态机的设计,即状态的定义+状态的转移函数

2.2.解题步骤

第一步,进行状态定义,并设计好状态转移图(这是最难也是最重要的一步,这步错了或者设计不合理,后面也就barbecue了)

第二步,初始化状态为INIT

第三步,进行遍历。根据当前状态+遍历的当前条件,进行当前状态的转移更新

3.解题代码

Python代码

class Solution:
    # 状态机; 关键: 状态的定义+状态的转移函数
    def isNumber(self, s: str) -> bool:
        # 第一步,进行状态定义,并设计好状态转移图(这是最难也是最重要的一步,这步错了或者设计不合理,后面也就barbecue了)
        # states=[
        #     "STATE_INIT",   # 初始状态
        #     "STATE_INT_SIGN", # 整数符号状态
        #     "STATE_INT",  # 整数状态
        #     "STATE_POINT",    # 左右整数的小数点状态
        #     "STATE_POINT_WITHOUT_LEFT_INT",   # 左无整数的小数点状态
        #     "STATE_FRACTION", # 小数状态
        #     "STATE_EXP",  # 指数状态
        #     "STATE_EXP_SIGN", # 指数后面的数字的符号状态
        #     "STATE_EXP_NUM",  # 指数的数字状态
        #     "STATE_END"   # 结束状态
        # ]
        # 第二步,初始化状态为INIT
        currentState="STATE_INIT"
        # 第三步,进行遍历。根据当前状态+遍历的当前条件,进行当前状态的转移更新
        for ch in s:
            if currentState=="STATE_INIT":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_INT"
                elif ch==".":
                    currentState="STATE_POINT_WITHOUT_LEFT_INT"
                elif ch=="+" or ch=="-":
                    currentState="STATE_INT_SIGN"
                else:
                    return False
            elif currentState=="STATE_INT_SIGN":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_INT"
                elif ch==".":
                    currentState="STATE_POINT_WITHOUT_LEFT_INT"
                else:
                    return False
            elif currentState=="STATE_INT":
                if ch.lower()=="e":
                    currentState="STATE_EXP"
                elif ch==".":
                    currentState="STATE_POINT"
                elif ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_INT"
                else:
                    return False
            elif currentState=="STATE_POINT":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_FRACTION"
                elif ch.lower()=="e":
                    currentState="STATE_EXP"
                else:
                    return False
            elif currentState=="STATE_POINT_WITHOUT_LEFT_INT":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_FRACTION"
                else:
                    return False
            elif currentState=="STATE_FRACTION":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_FRACTION"
                elif ch.lower()=="e":
                    currentState="STATE_EXP"
                else:
                    return False
            elif currentState=="STATE_EXP":
                if ch=="+" or ch=="-":
                    currentState="STATE_EXP_SIGN"
                elif ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_EXP_NUM"
                else:
                    return False
            elif currentState=="STATE_EXP_SIGN":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_EXP_NUM"
                else:
                    return False
            elif currentState=="STATE_EXP_NUM":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_EXP_NUM"
                else:
                    return False
            else:
                return False
        if currentState in ["STATE_INT","STATE_FRACTION","STATE_EXP_NUM","STATE_POINT"]:
            currentState="STATE_END"
        # print(currentState)
        return currentState=="STATE_END"

4.执行结果

在这里插入图片描述


http://www.kler.cn/news/316255.html

相关文章:

  • 基于单片机的智能小车的开发与设计
  • 机器学习课程学习周报十三
  • 蜗牛兼职网:Spring Boot与微服务
  • 正点原子阿尔法ARM开发板-IMX6ULL(七)——BSP工程管理实验(补:链接文件和.s文件)
  • 【C++】【网络】【Linux系统编程】单例模式,加锁封装TCP/IP协议套接字
  • 【MyBatis 源码拆解系列】MyBatis 运行原理 - 读取 xml 配置文件
  • 怎么在PPT中嵌入字体?2个做ppt的实用技巧,不容错过!
  • 深入解读 iVector:语音识别与说话人识别领域的关键技术
  • 食品安全群众满意度调查流程
  • 基于Python的自然语言处理系列(14):TorchText + biGRU + Attention + Teacher Forcing
  • 2016年国赛高教杯数学建模D题风电场运行状况分析及优化解题全过程文档及程序
  • 【python】字面量
  • 计算机毕业设计之:基于uni-app的校园活动信息共享系统设计与实现(三端开发,安卓前端+网站前端+网站后端)
  • Redis主从架构原理
  • sensitive-word 敏感词 v0.20.0 数字全部匹配,而不是部分匹配
  • Hive企业级调优[2]—— 测试用表
  • 生动好看的css卡片样式
  • pytorch 48 基于voc2012数据集对yolov10s模型进行剪枝尝试
  • 【JavaEE初阶】文件IO(上)
  • 阿里云kafka消息写入topic失败
  • 【Nginx】Nginx 使用 SSL 的详细指南
  • 内核是如何发送数据包
  • Python国产新 ORM 框架 fastzdp_sqlmodel 快速入门教程
  • AI时代保持并提升自身的核心竞争力
  • 常⻅中间件漏洞(WebLogic)靶场
  • 树莓派pico上手
  • 构建高可用和高防御力的云服务架构第五部分:PolarDB(5/5)
  • 今日leetCode 反转字符串
  • 第二证券:股价为什么出现大跌?股价大跌时怎么办?
  • 网安开发:杭州某科技银行面经和答案