【剑指offer】表示数值的字符串(python)
题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
解题思路:
(吐槽一下在写本题题解的时候,发觉我考虑的情况还是不够全面,牛客网剑指offer的测试用例太少了,下面是修改后的代码题解)
本题由于需要考虑到整数、小数、正负数以及指数,因此需要考虑的情况很多,对字符串s进行遍历,并用一个字符串r保存当前要求的字符,若不符合要求直接返回False,下面分情况进行讨论:
1、遍历的当前字符值为’e’或者’E’时,首先需要判断r中是否已包含’e’或者’E’,若已包含,直接返回False,其次需要判断s中’e’或者’E’后面的字符是否为空或是否为小数,若指数为空或为小数,直接返回False,否则将’e’或者’E’添加到r中:
if s[i] == 'E' or s[i] == 'e':
if s[-1: i: -1].find('E') != -1 or s[-1: i: -1].find('e') != -1 or s[-1: i: -1].find('.') != -1 or s[-1: i: -1] == '':
return False
r += s[i]
2、若当前字符值等于’-‘或者’+’,有两种情况需要判定:
(1)若当前r为空,则直接添加到r中;
(2)若r不为空,则判断r中最后一个节点是否为’e’或者’E’,若不是,直接返回False;
(3)若r不为空,则r中最后一个节点是为’e’或者’E’,则直接添加到r中。
elif s[i] == '-' or s[i] == '+':
if r == '':
r += s[i]
elif (r[-1] != 'e' and r[-1] != 'E'):
return False
else:
r += s[i]
3、若当前字符值为’.’,则判断r中是否已存在小数点,由于指数只能为整数,因此小数点只能出现一次。
elif s[i] == '.':
if r.find('.') != -1:
return False
r += s[i]
4、若当前字符值在’0’到’9’之间,直接添加到r中:
elif s[i] >= '0' and s[i] <= '9':
r += s[i]
5、如为其他字符,返回False。
6、若以上情况都没问题,返回True。
完整代码:
# -*- coding:utf-8 -*-
class Solution:
# s字符串
def isNumeric(self, s):
# write code here
r = ''
for i in range(len(s)):
if s[i] == 'E' or s[i] == 'e':
if s[-1: i: -1].find('E') != -1 or s[-1: i: -1].find('e') != -1 or s[-1: i: -1].find('.') != -1 or s[-1: i: -1] == '':
return False
r += s[i]
elif s[i] == '-' or s[i] == '+':
if r == '':
r += s[i]
elif (r[-1] != 'e' and r[-1] != 'E'):
return False
else:
r += s[i]
elif s[i] >= '0' and s[i] <= '9':
r += s[i]
elif s[i] == '.':
if r.find('.') != -1:
return False
r += s[i]
else:
return False
return True