公众号merlinsea
题目描述:
有效数字(按顺序)可以分成以下几个部分:
1、一个 小数 或者 整数
2、(可选)一个 'e' 或 'E' ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
1、(可选)一个符号字符('+' 或 '-')
2、下述格式之一:
2.1、至少一位数字,后面跟着一个点 '.'
2.2、至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字一个点 '.' ,后面跟着至少一位数字 。
整数(按顺序)可以分成以下几个部分:
1、(可选)一个符号字符('+' 或 '-')
2、至少一位数字
题目链接:https://leetcode-cn.com/problems/valid-number
示例:
部分有效数字列举如下:
["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1","0.e1","53.5e93", "-123.456e789"]
部分无效数字列举如下:
["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53",".",".e1"]
给你一个字符串 s ,如果 s 是一个有效数字 ,请返回 true,否则返回false。
通过观察可以得出以下结论:
1、数字字符串中只能出现1次 e/E【代表的是科学计数法】,或者不出现e/E
2、若出现e/E,e的前面部分可以是小数也可以是整数,e的后面部分只能是整数
3、如果是小数那么只能出现1次小数点. 小数点前面和后面至少有一边要出现数字。
4、+/—号只能出现一次,要么是出现在整个数字的最前面,要么是出现在E/e的后面第一位
5、不能出现上述字符和数字之外的其他字符 综上所诉:
解题思路就是以e为分割点,e之前可以是小数也可以是是整数,e之后必须是整数为总体思路考虑问题
解题代码如下
class Solution { public boolean isNumber(String s) { //是否遇见正负号 boolean sign = false; //是否遇见e boolean e = false; //是否遇见小数点 boolean dot = false; //是否遇见数字 boolean num = false; int i = 0; while(i<s.length()){ char c = s.charAt(i); if(c=='+' || c=='-'){ //正负号只能出现在首位 if(e){ //e出现了 if(!sign && !num){ sign=true; }else{ return false; } }else{ //e没出现 if(!sign && !num && !dot){ sign=true; }else{ return false; } } }else if(c=='.'){ if(dot){ return false; } dot=true; }else if(c=='e' || c=='E'){ //e只能出现一次,且e之前必须出现数字 if(e || !num){ return false; } //重置结果,重新判断e之后的结果 dot=true; num=false; sign=false; e=true; }else if(c>='0' && c<='9'){ num=true; }else{ return false; } i++; } return num; } }