1. 程式人生 > >[劍指Offer] 20_表示數值的字串

[劍指Offer] 20_表示數值的字串

題目:

請實現一個函式來判斷字串是否表示數值(包括整數和小數)。

例:

字串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"都表示數值,
但"12e"、“1a3.14”、“1.2.3”、“±5”、"12e+5.4"都不是。


思路

  1. 先寫出匹配的模式:
    [+,-]?[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 或者 . 則再次呼叫設定不同允許處理不同情況。
    1. 時間複雜度:O(n)
    2. 空間複雜度: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)

思考

我的程式碼將各部分的判斷都寫在一個函式裡,可能像作者那樣將函式功能分開會便於程式碼的維護。