剑指offer——python【第53题】表示数值的字符串
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路
根据题目给出的一些规则,可以表示成数值的字符串类型有:int整型,float浮点型,指数型(包括e和E),当然,前面三种都可以带上正负号;
不能表示成数值的字符串类型有:指数型错误(没有指数或者指数是小数,或者指数变成了a),float浮点型错误,第一个正负号后又带了正负号
于是,正负号类型的错误可以用if..else去判断;而在判定为没有正负号的错误下,再判断是否可以表达为数值型,就可以用float函数,再加上try..except
解答
class Solution: # s字符串 def isNumeric(self, s): # write code here if s[0]=="+" or s[0]=="-": if s[1]!="+" and s[1]!="-": try: if float(s[1:]): return True except: return False else: return False else: try: if float(s): return True except: return False
也可以很准确地去判断:
class Solution: # s字符串 def isNumeric(self, s): # write code here if s is None or len(s) == 0: return False # 是否有e hasE = False # 是否有小数 isDecimal = False # 是否有+-符号 hasSign = False for i in range(len(s)): # 如果有e,只能有一个e且不能是最后一个 if s[i] == "e" or s[i] == "E": if hasE or i == len(s) - 1: return False hasE = True # 小数点不能重复出现或和e共线 elif s[i] == ".": if hasE or isDecimal: return False isDecimal = True elif s[i] == "-" or s[i] == "+": # 重复出现符号时,必须跟在e后面 if hasSign and s[i - 1] != "e" and s[i - 1] != "E": return False # 重复出现符号时,必须跟在e后面 if not hasSign and i > 0 and s[i - 1] != "e" and s[i - 1] != "E": return False hasSign = True elif s[i] < "0" or s[i] > "9": return False return True
人生苦短,何不用python