题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
题目分析:
这道题目基本不涉及算法的知识,主要考察对多种情况考虑的全面性。
最开始拿到的时候大致看了看,感觉可能出现情况极其的多。理了理思路后发现要使代码通用性强一点,其实可以总结为几条规则。
当目前的字符为以下情况时:
- 数字字符:继续搜索。
- 小数点:
- 不可为第一位或者最后一位
- 不可出现在e/E后面
- 至多只可出现一次
- + / -
- 只可出现在第一位或者 e/E 后面
- e / E
- 不可为第一位或者最后一位
- 至多只可出现一次
总结来说有一个技巧,当出现了 e/E后,可以重新更新新视角意义上的数字第一位,因为其后面的字符可以定义为一个新的数字,只不过不可再出现 e/E 或者 小数点。
AC 代码:
# -*- coding:utf-8 -*-
class Solution:
# s字符串
def isNumeric(self, s):
num_end_pos = len(s) - 1
num_start_pos = 0
e_mark = False
dot_mark = False
for i in range(num_end_pos+1):
num = s[i]
if num in '+-':
if i > num_start_pos: return False
elif num.isdigit(): continue
elif num in '.':
if not num_start_pos < i < num_end_pos or e_mark or dot_mark: return False
else: dot_mark = True
elif num in 'eE':
if not num_start_pos < i < num_end_pos or e_mark: return False
else:
e_mark = True
num_start_pos = i + 1
else:
return False
return True