题目描述:
验证给定的字符串是否为数字。
例如:
“0” => true
" 0.1 " => true
“abc” => false
“1 a” => false
“2e10” => true
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。
分析:
1)出现在e之前的应该为一个有效的浮点数,e之后的应该为有效整数。
2)有效浮点数规则:
# a)正负号只能出现在最前面;
# b)小数点至多一个;
# c)中间不能出现其他非数字字符;
# d)至少有一个数字
3)有效整数规则:
# a)正负号只能出现在最前面;
# b)中间不能出现其他非数字字符;
# c)至少有一个数字
解法:
class Solution(object):
def isNumber(self, s):
"""
:type s: str
:rtype: bool
"""
def isInt(s):
NO_NUM = True
for i in range(len(s)):
# 正负号只能在首位
if s[i] =="+" or s[i] =="-":
if i == 0:
continue
else:
return False#加上continue 超过 56% ,不加 超过 22%
# 至少有一个数字
elif s[i] in "1234567890":
NO_NUM = False
# 不能有其他字符
else:
return False
return not NO_NUM
def isFloat(s):
DOT_COUNT = 0
NO_NUM = True
for i in range(len(s)):
# 正负号只能在首位
if s[i] =="+" or s[i] =="-":
if i == 0:
continue
else:
return False
# 小数点至多有一个
elif s[i] ==".":
DOT_COUNT += 1
if DOT_COUNT > 1:
return False
# 至少有一个数字
elif s[i] in "1234567890":
NO_NUM = False
# 不能有其他字符
else:
return False
return not NO_NUM
s = s.strip()
if 'e' not in s:
return isFloat(s)
else:
t = s.split('e')
if len(t) == 2:
return (isInt(t[1]) and isFloat(t[0]))
else:
return False
小结
分析的时候条件要搞清楚,分类讨论的指标要一致,在这里我们按照某一位可能出现的字符来分类讨论,条理就比较清晰