问题描述:
验证给定的字符串是否为数字。
例如:
字符串 | true or false |
---|---|
“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 |
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。
问题分析:
方法1:
(1)借用,编程语言自带函数实现,(好像在作弊哈)
方法2:
尽可能的考虑更多的情况,其中仔细归纳一下,会发现,规则并不多。
(1)首先,对一个字符串来说,要去除首位的空格符。
(2)字符e
,只能出现数字后面,且e
后面不能出现小数点(.)
,也就是e
后面必须是整数。
(3)+
、-
号,只能出现在首位,或者紧跟e
的后面,其他情况均不对。
(4)小数点(.)
只能出现一次,且只能是出现在e
的前面。
(5)根据上面几条规则,可以设置几个标识符,例如,isDot
, isDigit
, isE
扫描一边字符串,即可完成。
Python3实现:
# 方法 1
class Solution:
def isNumber(self, s):
try:
float(s)
except:
return False
return True
if __name__ == '__main__':
solu = Solution()
print(solu.isNumber('95a54e53'))
# 方法 2
class Solution:
def isNumber(self, s):
s = s.strip() # 去除首尾空格
isDot, isDigit, isE = False, False, False # 点,数字,e
for i, x in enumerate(s):
if x == "e":
if not isDigit or isE: # 前面没有数字,or 前面已经存在字符 e
return False
isDigit = False # 设置isDigit = false
isE = True
elif x in "+-":
if i != 0 and s[i-1] != "e": # +- 只能出现首位,和 字符e的后面
return False
elif x == ".":
if isDot or isE: # 字符 .(小数点)只能出现一次,而且是只能出现在 e 的前面
return False
isDot = True
elif x.isdecimal(): # 检查字符串是否只包含十进制字符
isDigit = True
else:
return False
return len(s) > 0 and isDigit
if __name__ == '__main__':
solu = Solution()
print(solu.isNumber('95a54e53'))
声明: 总结学习,有问题或不妥之处,可以批评指正哦。
题目链接:leetcode-cn.com/problems/valid-number/
参考链接:他人提交的优秀代码,链接不详。