剑指offer 20 - 表示数值的字符串 - python

244 阅读1分钟

题目描述:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

思路

  • 法1: 充分考虑所有不合法的情况:

    • 小数点重复出现
    • e或E后面不是-或数字
    • E或E和小数点重复出现
    • +和-相邻
    • e或E有多个或只有一个但是最后一个字符
  • 法2: 使用unicodedata.numeric()进行判断


AC代码

# -*- coding:utf-8 -*-
class Solution:
    # s字符串
    def isNumeric(self, s):
        # write code here
        if s is None or len(s) == 0:
            return False

        # 是否有e
        hasE = False
        # 是否有小数
        isDecimal = False
        # 是否有+-符号
        hasSign = False

        for i in range(len(s)):
            # 如果有e,只能有一个e且不能是最后一个
            if s[i] == "e" or s[i] == "E":
                if hasE or i == len(s) - 1:
                    return False
                hasE = True
            # 小数点不能重复出现或和e共线
            elif s[i] == ".":
                if hasE or isDecimal:
                    return False
                isDecimal = True
            elif s[i] == "-" or s[i] == "+":
                # 重复出现符号时,必须跟在e后面
                if hasSign and s[i - 1] != "e" and s[i - 1] != "E":
                    return False
                # 重复出现符号时,必须跟在e后面
                if not hasSign and i > 0 and s[i - 1] != "e" and s[i - 1] != "E":
                    return False
                hasSign = True
            elif s[i] < "0" or s[i] > "9":
                return False
        return True

法2

# -*- coding:utf-8 -*-
import unicodedata
class Solution:
    # s字符串
    def isNumeric(self, s):
        def is_number(s):
            try:
                float(s)
                return True
            except ValueError:
                pass

            try:
                unicodedata.numeric(s)
                return True
            except (TypeError, ValueError):
                pass

            return False
        
        return is_number(s)