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"