请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"及”-1E-16"都表示数值,但"12e"、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。
5E2合法,5E2.O不合法,5E2代表5*10²
合法的指数形式满足以下两个条件:
1。注意字母E(或e)之前必须有数字(整数或实数)。
2。E(或e)的后面的指数必须为整数
刚开始全部一起考虑,混淆,很乱!!注意可以抽象出一个一个的函数,当遇到’e’ ,‘+’等的时候,使用什么函数,后面再把函数合进去也行,分开考虑就会注意到很多情况是重叠的,就不需要过多的考虑。
自己写的解法是把各种情况进行考虑,但是比较复杂,主要是注意设置几个标志,考虑特殊情况!!
q[i] >= '0’注意加上‘ ’,因为字符就要跟字符比,而不是数字!!!
变量还是最好有实际的意义,便于理解。
class Solution(object):
def isNumber(self, q): # 一定要有数字,没有就是错的。
met_dot = 0 #这是逗号的标志
met_e = 0 # e的标志
#设置三个标志的思路是对的!!
q = q.strip() #直接去掉首尾的空格这一步很重要
scannumber = 0 # 有无数字的标志
if not q:
return False
for i in range(0, len(q)):
if q[i] == '.':
if len(q)-1 == 0 :
return False
if met_e != 0:
return False
met_dot += 1
if met_dot == 2:
return False
elif q[i] == '+' or q[i] == '-':
if len(q)-1 == 0:
return False
if i == len(q)-1:
return False
if i == 0:
continue
if q[i - 1] == 'e' or q[i - 1] == 'E':
# 0的时候,-1可能是个bug,q[-1]是最后一个,要注意!
continue
else:
return False
elif q[i] == 'E' or q[i] =='e':
if scannumber == 0:
return False
if i == 0:
return False
if i == len(q)-1:
return False
met_e += 1
if met_e == 2:
return False
elif q[i] >= '0' and q[i] <= '9':
scannumber += 1
continue
else:
return False
if scannumber != 0:
return True
else:
return False
第二种方法的时间和空间复杂度较差,是通过异常的抛出来判别的。float()是判断能不能转换为浮点数。如果不能就抛出异常。
class Solution(object):
def isNumber(self, s):
try:
float(s)
return True
except :
return False
说了是整数,那就是32个字节,那么范围就是 -231 到 231-1(从第0位开始,那么最高就是31)
# 这道题的需求是提取出前半部分的整数
class Solution:
def atoi(self , str ):
# write code here
if not str:
return 0
res = 0
sign = 0
str = str.strip() #注意使用“+”判别的时候,先把首尾的空格去掉。
# 养成一个习惯,如果前后有空格,那么先去掉。
for i in range(len(str)):
if str[i] == ".":
break
if i == 0 and str[i] == "-":
sign = 1
continue
elif i == 0 and str[i] == "+":
continue
if str[i] == " ":
continue
if "0" <= str[i] <= "9":
res = res * 10 + ord(str[i]) - ord("0")
else:
break
##################整数,4个字节,32位
if res > 2**31 - 1:
if sign:
res = 2**31
else:
res = 2**31-1
#################################
if sign:
return -res
else:
return res