剑指offer JZ53 表示数值的字符串 Python 多解

一.题目描述

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

二.解题思路

首先分析一下不是数字的情况:

1.出现的字符不是合理的数字或者符号位、e/E等,如'a'.

2.小数点,e出现超过1次。

3.小数点,e,符号出现在字符串末尾

4.符号位不是出现在最高位,如第一位或者e的后面。

5.e后面出现小数。

6.符号位出现次数大于2.(若出现次数为2必须满足条件4)。

3种方法。

<1>分治

找到最近的e/E,它的左边和右边必须也为数字,并且右边不能为小数。这样子比较容易处理符号必须在第一位或者无的问题。

并且只要当前数字中再出现e一定错。但是此方法最差要扫描三次字符串。

<2>

就按照之前提到的情况,设置各个符号的标识变量,就硬解,一边扫描。

<3>定义正则表达式,实现状态转换机。

三.源码

# 1
class Solution:
    # s字符串
    def isNumeric(self, s):
        # write code here
        def isNumericTool(s,e_flag):
            if not s:return False
            point_flag=False
            for i in range(len(s)):
                if (s[i]=='+' or s[i]=='-') and i==0:continue 
                if s[i]=='+' or s[i]=='-' or s[i]=='e' or s[i]=='E':return False
                if s[i]=='.': 
                    if point_flag or i==len(s)-1 or e_flag:return False
                    else:
                        point_flag=True
                        continue
                if ord(s[i])>57 or ord(s[i])<48:return False
            return True
                    
        idx1=s.find('e')
        idx2=s.find('E')
        if idx1!=-1 and idx2!=-1:return False
        if idx1==-1 and idx2==-1:return isNumericTool(s,False)
        else:
            idx=max(idx1,idx2)
            return isNumericTool(s[:idx],False) and isNumericTool(s[idx+1:],True)

# 2
class Solution:
    # s字符串
    def isNumeric(self, s):
        # write code here
        if not s:return False
        point_flag,e_flag,sign_flag=False,False,0
        for i in range(len(s)):
            if (s[i]=='+' or s[i]=='-'):
                if (i!=0 and s[i-1]!='e' and s[i-1]!='E') or sign_flag>2 or i==len(s)-1:
                    return False
                sign_flag+=1
            elif s[i]=='e' or s[i]=='E':
                if e_flag or i==len(s)-1:return False
                e_flag=True
            elif s[i]=='.': 
                if e_flag or point_flag or i==len(s)-1:return False
                point_flag=True
            elif ord(s[i])>57 or ord(s[i])<48:return False
        return True

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值