[剑指Offer] 20_表示数值的字符串

版权声明:Tian Run https://blog.csdn.net/u013908099/article/details/86151372

题目:

请实现一个函数来判断字符串是否表示数值(包括整数和小数)。

例:

字符串"+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)

思考

我的代码将各部分的判断都写在一个函数里,可能像作者那样将函数功能分开会便于代码的维护。

猜你喜欢

转载自blog.csdn.net/u013908099/article/details/86151372