题目描述:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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