题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。
思路:一开始想整个字符处理,但是发现容易出现判断条件过多的情况。故根据科学计数法的形式将数值分成两个(底数和浮点数两块)。即E前面的字符temp1,和E后面的字符temp2。 前面和后面的两个数判断标准基本一样,唯一差别为浮点数temp2不能是小数。
注意点:
1.可能出现非数字,正负号,小数点,E/e之外的数
2.正负号的位置是否对
3. 浮点数temp2不能有小数
4. 整个字符最前面和最后面的空格等并不算,可以直接去掉
5. 字符中间的空格和tap等是要算的,如果有则输出False
以下为提交的代码:
# 提交的代码
class Solution:
shuzi=['0','1','2', '3', '4', '5', '6', '7', '8', '9']
def num(self,s,t):
ans = 0
for i in s:
if(i==t):ans+=1
return ans
def num_shuzi(self, s):
ans = 0
for i in s:
if(i in self.shuzi): ans+=1
return ans
def isNumber(self, s: str) -> bool:
# + - . e E
zifu = ['-','+','.','E','e','0','1','2', '3', '4', '5', '6', '7', '8', '9']
s = s.lower()
s=s.replace('-','+')
s = s.strip()
for i in s:
if(i not in zifu):return False
if(self.num_shuzi(s)==0):return False
if('e' in s):
num1 = self.num(s,'e')
if(num1>1): return False
temp1, temp2 = s.split("e")[0], s.split("e")[1]
else:
temp2 = '1'
temp1 = s
# 正负号
num1 = self.num(temp1,'+')
num2 = self.num(temp2,'+')
#print(num1,num2,"====")
if(num1 > 1 or num2 > 1):return False
if(num1==1 and temp1[0]!='+'): return False
if(num2==1 and temp2[0]!='+'): return False
# 左右的数字
num1 = self.num_shuzi(temp1)
num2 = self.num_shuzi(temp2)
if(num1 ==0 or num2 ==0): return False
# 左右的小数点
num1 = self.num(temp1,'.')
num2 = self.num(temp2,'.')
if(num2>0 or num1>1):return False
return True
无赖做法(直接异常处理),自己写代码可以,面试官好看的话还是不要放:
class Solution:
def isNumber(self, s: str) -> bool:
try:
float(s)
except ValueError:
return False
return True
有限自动机写:思路很清晰
https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/mian-shi-ti-20-biao-shi-shu-zhi-de-zi-fu-chuan-y-2/