解题思路-leetcode第六十五题:有效数字
题目描述:
验证给定的字符串是否可以解释为十进制数字。
例如:
“0” => true
" 0.1 " => true
“abc” => false
“1 a” => false
“2e10” => true
" -90e3 " => true
" 1e" => false
“e3” => false
" 6e-1" => true
" 99e2.5 " => false
“53.5e93” => true
" --6 " => false
“-+3” => false
“95a54e53” => false
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:
数字 0-9
指数 - “e”
正/负号 - “+”/"-"
小数点 - “.”
当然,在输入中,这些字符的上下文也很重要。
解题思路:本题采用循环遍历字符串,然后分类判断的方法,通过设置4个标记来判断当前字符串是否有效,4个标记分别问,数字标记num,点标记dot,e标记e,e后是否有数字标记e_after,循环内分四种情况,当遍历字符为数字时,则将num,e_after置为true,当遍历正负号时,首先判断,正负号位置以及正负号前是否为e,若位置不处于开头且前一位不为e,则此字符串无效。当遍历小数点时,若之前出现过小数点或者之前出现过e,则字符串无效,当遍历到e时,若之前出现过e或者之前不是数字,则字符串无效,最后,若出现其余字符,则字符串无效。最后返回数字标记num与e后是否有数字标记e_after的and值。代码如下:
class Solution:
def isNumber(self, s: str) -> bool:
s = s.strip()
num, dot, e, e_after = False, False, False, False
for i in range(len(s)):
if s[i] in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'):
num = True
e_after = True
elif s[i] == '.':
if dot or e:
return False
dot = True
elif s[i] in ('+', '-'):
if i > 0 and s[i-1] != 'e':
return False
elif s[i] == 'e':
if e or not num:
return False
e = True
num = False
else:
return False
return num and e_after
提交后,通过。