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

1. 题意

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

2. 思路

把所有表示数值的情况遍历出来

  • 第一: 字符串只包含数字,小数点,正负号,字母’e’或’E’
  • 第二:个数限制
    • 出现e时: 只出现一次e, e之前和之后的部分都是数值,并且e之后必须为整数(可能带符号)
    • 不出现e时,最多出现一个小数点,一个正负号,小数点之后必须有数字,正负号之后也得有

特别注意:+.123也是表示数值

3. python 实现

3.1 方法一:按照上述思路进行遍历

	def isNumeric(self, s):
        # write code here
        def isDigit1(s): # 不出现e时,判断是否符合要求
            if s[0] == '+' or s[0]=='-':
                s = s[1:]
            dot_index = s.find('.')
            if dot_index != -1: # 出现小数点时
                if s[0:dot_index] and s[0:dot_index].isdigit() and s[dot_index+1:].isdigit():
                    return True
                if not s[0:dot_index] and s[dot_index+1:].isdigit():
                    return True
                return False
            else: # 不出现小数点时
                return s.isdigit()
        
        def isInt(s): # 出现e时,e之后的数为整数
            if not s: return False
            if s[0] == '+' or s[0]=='-':
                s = s[1:]
            dot_index = s.find('.')
            if dot_index == -1 and s.isdigit(): # 不出现小数点时
                return True
            return False
        
        if not s: return False
        for ch in s:
            if ord('0')<=ord(ch)<=ord('9') or ch == '.' or ch=='+' or ch=='-' or ch=='e' or ch=='E':
                continue
            else:
                return False
            
        cc = []
        e_index = -1
        if 'e' in s:
            cc = s.split('e')
            e_index = s.find('e')
        elif 'E' in s:
            cc = s.split('E')
            e_index = s.find('E')
        
        if e_index == -1: # 不出现e时
            return isDigit1(s)
        else:
            if len(cc) == 2: # 出现一个e时
                return isDigit1(cc[0]) and isInt(cc[1])
            return False

3.2 方法二:正则表达式匹配

import re
class Solution:
    def isNumeric(self, s):
        return re.match(r"^[\+\-]?[0-9]*(\.[0-9]*)?([eE][\+\-]?[0-9]+)?$",s)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值