有效数字(按顺序)可以分成以下几个部分:
'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)