描述
Validate if a given string is numeric.
Some examples:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
分析
该题的说明比较模糊,所以需要慢慢进行尝试来弄清楚哪些是合法的数字。整理了以下规则:
- 符号只能出现在最前面或者字符
e
后面一位 - ' . '只能
e
的前面,且只能有一个小数点 -
e
最多只能出现一次,且前面必须有数字,后面也必须有数字
所以按照数字、小数点、e
和符号这四类列出规则就可以了,记住e
后面必须有数字,所以需要增加一个变量numberAftereSeen
。
代码
class Solution: def isNumber(self, s): """ :type s: str :rtype: bool """ # 去除前后的空格 temp_s = s.strip() numberSeen = False pointSeen = False eSeen = False numberAftereSeen = True for i in range(len(temp_s)): if temp_s[i].isdigit(): numberSeen = True numberAftereSeen = True elif temp_s[i] == ".": # 小数点前面不能出现e和小数点 if eSeen or pointSeen: return False pointSeen = True elif temp_s[i] == "e": # e前面不能出现e,并且需要有数字 if eSeen or not numberSeen: return False eSeen = True # 保证e后面也有数字 numberAftereSeen = False elif temp_s[i] in ["+", "-"]: # 符号只能再0位和e后面一位 if i != 0 and temp_s[i-1] != "e": return False else: return False return numberSeen and numberAftereSeen