当前位置: 移动技术网 > IT编程>脚本编程>Python > 剑指offer JZ53 表示数值的字符串 Python 多解

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

2020年07月16日  | 移动技术网IT编程  | 我要评论
一.题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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

一.题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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

 

本文地址:https://blog.csdn.net/CSerwangjun/article/details/107367555

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网