题目
有效数字(按顺序)可以分成以下几个部分:
一个 小数 或者 整数
(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(’+’ 或 ‘-’)
下述格式之一:
至少一位数字,后面跟着一个点 ‘.’
至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
一个点 ‘.’ ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(’+’ 或 ‘-’)
至少一位数字
部分有效数字列举如下:
[“2”, “0089”, “-0.1”, “+3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e+7”, “+6e-1”, “53.5e93”, “-123.456e789”]
部分无效数字列举如下:
[“abc”, “1a”, “1e”, “e3”, “99e2.5”, “–6”, “-+3”, “95a54e53”]
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。
示例 1:
输入:s = “0”
输出:true
示例 2:
输入:s = “e”
输出:false
示例 3:
输入:s = “.”
输出:false
示例 4:
输入:s = “.1”
输出:true
- 方法一:细节题
class Solution {
public:
bool isNumber(string s) {
bool sign = false;//是否有+或-
bool num = false;//是否有数字
bool point = false;//小数部分是否合法
bool exp = false;//e之前是否合法
//遍历判断每一个字符
for(int i=0; i<s.size(); i++){
//如果不是第一次出现的+或-,返回false
if(s[i]=='+' || s[i]=='-'){
if(sign){
return false;
}//如果是第一次出现,且是第一个字符或e之后的字符,表示合法
if(i==0 || s[i-1]=='e'|| s[i-1]=='E'){
sign = true;
}else{
return false;
}
//如果不是第一次出现或在e之后出现,返回false
}else if(s[i] == '.'){
if(exp || point){
return false;
}//否则表示合法
point = true;
//如果不是第一次出现或e之前没有有效数字,返回false
}else if(s[i] == 'e'|| s[i]=='E'){
if(exp ||(num == false )){
return false;
}else{//否则表示合法,为之后判断e后是否有有效数字做准备
sign = false;
num = false;
exp = true;
}
//如果为数字则表示num为有效数字
}else if('0' <= s[i] && s[i] <='9'){
num = true;
}else{
//除了以上四类字符外的任何字符都返回false
return false;
}
}
return num;//返回所有字符串遍历结束后num是否为有效数字
}
};
-
时间复杂度O(n)
-
空间复杂度O(1)
-
思路
- 一个有效数字可以由以下几部分组成:符号+整数部分+小数点+小数部分+指数e/E+符号+整数部分
- 符号为非必需
- 有效数字必需存在,可以为整数+小数点+小数部分或整数或小数点+小数部分
- 一旦出现指数e,则其前必需出现有效数字且其后必需出现有效数字
- 定义四个逻辑变量
- sign:此前是否出现过+/-
- num:此前是否有整数部分或小数部分
- point:此前是否出现过小数点
- exp:此前是否出现过e
- 遍历字符串,对每个字符做判断
- 如果当前字符为+或-。判断是否为第一次出现,如果是第一次出现且为第一个字符或它的前一个字符为e,将sign设置为true,其余情况返回false。(出现e之后会将sign的状态重置,故只需要判断是否为第一次出现)
- 如果当前的字符为‘.’。判断是否第一次出现且在e出现之前出现,如果是则将point设置为true,否则返回false。(根据point判断小数部分的位置是否合法,即在e之前,故可以将整数部分与小数部分合并为一个变量即num)
- 如果当前的字符为e或E。如果此时e是第一次出现且它之前有有效数字,将exp设置为true且将num、sign设置为false(为了为之后判断e之后是否有有效数字做准备),否则返回false。
- 如果当前字符在0到9之间。表示有有效数字,将num设置为true。
- 如果该字符不属于以上任何一种情况,返回false
- 返回此时是否有有效数字
- 一个有效数字可以由以下几部分组成:符号+整数部分+小数点+小数部分+指数e/E+符号+整数部分
-
方法二:有限自动机