[劍指Offer] 20_表示數值的字串
阿新 • • 發佈:2019-01-13
題目:
請實現一個函式來判斷字串是否表示數值(包括整數和小數)。
例:
字串"+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)
思考
我的程式碼將各部分的判斷都寫在一個函式裡,可能像作者那樣將函式功能分開會便於程式碼的維護。