欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-10 21:30:59
一.题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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