题目:
请实现一个函数来判断字符串是否表示数值(包括整数和小数)。
例:
字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"都表示数值,
但"12e"、“1a3.14”、“1.2.3”、“±5”、"12e+5.4"都不是。
思路
- 先写出匹配的模式:
[+,-]?[0-9]*.?[0-9]*[E,e]?[+,-]?[0-9]+。
[+,-](0/1次)[0-9](任意次).(0/1次)[0-9](任意次)[E,e](0/1次)[+,-](0/1次)[0-9](1/多次)
可以看到对于字符串的处理在出现 . 和 E/e 的时候发生变化
对于一个字符串:1、只允许首位为符号、E后首位为符号 2. 只允许E前出现一次 . 3、其余都是数字
因此可以设计函数带有是否允许 E 和 . 的关键词,遍历字符串,遇到 E 或者 . 则再次调用设置不同允许处理不同情况。- 时间复杂度:O(n)
- 空间复杂度:O(1)
代码
思路1:时间复杂度:O(n),空间复杂度:O(1)
def numeric_strings(s):
"""
:param s: num string
:return: is num
"""
def is_num(s, allow_dot = True, allow_E = True):
"""
:param s: num string
:param allow_dot: if allow .
:param allow_E: if allow E/e
:return: Bool
"""
number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
sign = ['+', '-']
if s[0] in sign:
i = 1
else:
i = 0
while i < len(s):
str = s[i]
if str in number:
pass
elif str == '.' and allow_dot:
return is_num(s[i+1:], allow_dot = False)
elif str in ['e', 'E'] and allow_E and i + 1 < len(s):
return is_num(s[i+1:], allow_dot = False, allow_E = False)
else:
return False
i += 1
return True
return is_num(s)
思考
我的代码将各部分的判断都写在一个函数里,可能像作者那样将函数功能分开会便于代码的维护。