剑指offer[20]——表示数值的字符串
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
解题思路及相应代码
class Solution:
def isNumeric(self, str):
# write code here
# 先对输入进行一个判断
if str is None or len(str) == 0:
return False
# 先判断是否已“+/-Number”的形式开头,因为"+/-"只能出现在开头才能表示Number
numeric, str = self.scanInteger(str)
i = 0
if i < len(str) and str[i] == '.':
i += 1
if i < len(str):
numeric_i, str = self.scanUnsignedInteger(str[i:])
else:
numeric_i = True
str = str[i:]
# 小数点前可以没有整数部分,如".123"
# 小数点后可以没有数字,如“233.”
# 小数点前后都可以有数字,综上下面一行代码应该用“|”
numeric = numeric | numeric_i
i = 0
if i < len(str) and (str[i] == 'e' or str[i] == 'E'):
i += 1
if i < len(str):
numeric_i, str = self.scanInteger(str[i:])
else:
numeric_i = False
# 当”e/E“前面没有数字时,整个字符串不能表示数字,如“.e1”, "e2"
# 当“e/E”后面没有整数时,整个字符串不能表示数字,如“12e”,“12e+3.4”
# 但是需要注意一种情况就是,“e/E”后面可以接带有符号的整数,如“123e+6”,为科学记数法
numeric = numeric_i & numeric
return numeric and (len(str) == 0)
# 在这里需要注意,不能光返回numeric,因为很可能出现“1ae345”这种情况,即乱入其他符号,因此需要判断此时是否已经
# 将字符串扫描结束了。
def scanInteger(self, str):
i = 0
if str[i] == '+' or str[i] == '-':
i += 1
return self.scanUnsignedInteger(str[i:])
def scanUnsignedInteger(self, str):
i = 0
numeric = False
while i < len(str) and str[i] >= '0' and str[i] <= '9':
i+= 1
numeric= True
return numeric, str[i:]
自己的感想
这可以说是自己第一次在牛客网上写题,之前刷题都是在本地编辑器上写的,结果笔试的时候经常出现“case 0.00%,可能存在语法错误或者数组索引溢出”这类的错误提示,我一直找不到原因,这次算是明白了,原来在Pycharm中写代码,由于很多默认的一些设置编辑器会自动给出,导致在笔试的时候犯了一些很基础的错误,譬如在class中定义函数时忘记带入self,中英文输入法混用,缩进不规范等等一系列的情况,所以以后即使在本地编辑器上跑通了程序,也应该要去牛客网上自己重新写一下代码。