剑指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