这题难点只有边界问题的考虑,所以最好一开始就考虑全面点,省的不断的调bug,给面试官不好的印象。
那么结合上图中给的提示,大概有以下几种情况:
- e/E之前和e/E之后可以看做是两个部分。
- e/E之前的部分:
+/-只能在头部出现,且只能出现一次;
数字直接continue
非e/E的字符出现,直接return False
头部如果出现".",直接return False
非头部如果出现一次".",后面如果再出现".",则return False - e/E之后的部分:
+/-只能在头部出现,且只能出现一次;
如果有".",直接return False
如果触发e/E之后的部分,e/E后没有其他数字了,要return False
其他符号也要return False
以上即为全部的边界条件,通过多个flag去进行控制。
见代码
# -*- coding:utf-8 -*-
class Solution:
# s字符串
def isNumeric(self, s):
# write code here
flag = 0 # 是否有e/E,默认没有为0
_flag = 0 # e/E后的加/减号的flag
dot_flag = 0 # e/E前的“.”的flag
i = 0
count = 0 # 判断触发e/E后是否仍有数字
if s[i] == '+':
i += 1
elif s[i] == '-':
i += 1
elif s[i] == '.': # 头部如果出现".",直接return False
return False
for item in s[i:]:
if flag == 0: # e/E之前的部分
if dot_flag == 1 and item == '.':
return False
if '0' <= item <= '9': # 数字直接continue
continue
if item == 'e' or item == 'E': # 触发e/E后的部分
flag = 1
continue
if item == '.':
# 非头部如果出现一次".",后面如果再出现".",则return False
dot_flag = 1
continue
else:
return False
else:
count += 1
# 如果触发e/E之后的部分,e/E后没有其他数字了,要return False
if _flag == 1 and item == '-':
# +/-只能在头部出现,且只能出现一次;
return False
if item == '+':
_flag = 1
continue
if item == '-':
_flag = 1
continue
if item == '.': # 有"."直接False
return False
if '0' <= item <= '9':
continue
else:
return False
if flag == 1 and count == 0:
return False
return True