题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。
LeetCode原题:表示数值的字符串
分析一下能够字符串能够表示数值的满足条件有:
- 指数符号只能出现一次;
- 正负号出现的地方的前一位置必须是指数符号,或者是在开头位置出现;
- 指数符号不能出现在开头;
- 小数点同样只能出现一次,并且不能在指数符号出现以后再出现;
- 只能包含指数符号、小数点、数字字符;
- 指数出现以后,必须有数字出现;
捋一下总体思路:
- 指数符号出现第二次,返回False;
- 如果正负号出现时,前一位置不是指数符号,返回False;
- 数字字符出现之前,不能出现指数符号,否则False;
- 出现其他类型字符,返回Flase;
- 指数出现以后,小数点不能在出现,否则Flase,小数点只能出现一次,否则也是False;
- 指数出现以后,如果没有数字出现,False;
翻译成代码如下:
class Solution:
def isNumber(self, s: str) -> bool:
s = s.strip()
met_dot = met_e = met_digit = False
for i, char in enumerate(s):
if char in ('+', '-'):
if i > 0 and s[i-1] != 'e' and s[i-1] != 'E':
return False
elif char == '.':
# 遇到小数点之前不能有小数点出现过或者有指数 e 出现
if met_dot or met_e:
return False
met_dot = True
elif char == 'e' or char == 'E':
# 遇到指数符号时,之前不能有指数符号,而且指数符号前必须有数字
if met_e or not met_digit:
return False
met_e, met_digit = True, False # e后必须接数字,所以这时重置met_digit为False,以免e为最后一个char
elif char >= '0' and char <= '9':
met_digit = True
else: # 遇到其他类型字符
return False
return met_digit