一、题设
有效数字(按顺序)可以分成以下几个部分:
- 一个 小数 或者 整数
- (可选)一个
'e'
或'E'
,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 下述格式之一:
- 至少一位数字,后面跟着一个点
'.'
- 至少一位数字,后面跟着一个点
'.'
,后面再跟着至少一位数字 - 一个点
'.'
,后面跟着至少一位数字
- 至少一位数字,后面跟着一个点
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 至少一位数字
部分有效数字列举如下:["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"]
给你一个字符串 s
,如果 s
是一个 有效数字 ,请返回 true
。
示例 1:
输入:s = "0" 输出:true
示例 2:
输入:s = "e" 输出:false
示例 3:
输入:s = "." 输出:false
二、基本思路
根据题意,合法的表达为:(小数/整数)[E/e (整数)]
思路就是先找到e/E,再判断前面是否为小数或者整数,后面是否为整数即可。
step1:找到e/E:遍历数组,找到e/E break跳出即可。
step2:判断一个数是否为整数:有标志位无关紧要跳过,当出现小数点'.',则返回False;当出现一个数字时,即可返回True,其余情况都是返回False.
step3:判断一个数是否为小数:有标志位同样跳过,当同时满足出现小数点一次,数字一次以上时,即可返回True,其余情况都是返回False.
三、代码实现
def isNumber(self, s):
def check(st,IsInt):
start = 0
if start < len(st) and (st[start] == '+' or st[start] == '-'):
start += 1
point,digit = False,False
for i in range(start,len(st)):
if st[i] == '.' :
if point or IsInt:
return False
point = True
elif st[i] >= '0' and st[i] <= '9':
digit = True
else:
return False
return digit
eidx = -1
check("0",False)
for i in range(len(s)):
if s[i] == 'e' or s[i] == 'E':
eidx = i
break
if eidx == -1:
return check(s,False)
return check(s[0:eidx],False) and check(s[eidx+1:len(s)],True)
四、效率总结