有效数字
验证给定的字符串是否可以解释为十进制数字。
例如:
"0" = true " 0.1 " = true "abc" = false "1 a" = false "2e10" = true " -90e3 " = true " 1e" = false "e3" = false " 6e-1" = true " 99e2.5 " = false "53.5e93" = true " --6 " = false "-+3" = false "95a54e53" = false
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:
数字 0-9 指数 - "e" 正/负号 - "+"/"-" 小数点 - "." 当然,在输入中,这些字符的上下文也很重要。
题目分析
这题我感觉是一种代码实现问题,考查考虑问题是否全面? 没有什么特别的算法思想,想清楚判定数字的流程,然后一路判断下来即可。但是要实现你原计划的流程,还是要好好打理一下自己的代码。
字符特征 : 2.1 可能包含”0~9“,”e“,”.“,“+”,“-”,” “。 2.2 ”e” 允许出现的次数?还要考虑“e”后是否允许出现”." , ”+“,”-“?是否允许作为开头结尾?前面是否一定要有数字? 2.3 “." 允许出现的次数? ”." 后是否允许出现 “e" , "+ " ,"- "?是否允许作为开头结尾 ?前面是否一定要有数字? 2.4 ”+“ ,”-“,最多出现两次,一次在幂,一次在指数,且一定位于其他符号之前,且不能作为结尾 2.5 ”0~9“ ,”0“是否允许在幂 或者 指数 或者 小数部分 的首部,是否允许”0“结尾的小数部分。 2.6 ” “,只能作为开头结尾。 2.7 整个数,必须要有数字出现。
判断流程 3.1 数前空格清除 3.2 首位判断+ - 号,然后进入幂部分/整数部分 3.3 正常判断数字,遇到 ”." 进入小数部分,“e” 进入指数部分,其余false。 3.4.1 小数部分,标记小数点已经用过,不能再出现,其余照常。 3.4.2 指数部分,检查e前是否有数字,”+“ ”-“可以再用,重置”+-“的标志位,小数点不能用了,小数点标志位置false,当然e也不能再用了。继续照常检查数字。 3.5 检查到” “,” “只能作为末尾出现,因此直接跳出主体循环,进入尾部判断环节。 3.6 数的结尾检查,不能是”e", "+ " "-" ,但可以是“ . ”。 3.7尾部清洗,一路检查是否是“ ”,遇到个不是的则false。 3.8 检查全部通过,但它也要有数字才可能是数!return HasNum;
题解代码
1 | class Solution { |