表示数值的字符串
解题思路
- 使用有限状态机 关键在于理清状态个数,尤其是检查DOt是否在数字前出现 因为出现Dot后不能在有第二个Dot
- C++ std::unordered_map 初始化
- C++ 去除std::string 首尾空格 s.erase s.find_first_not_of()
代码
class Solution {
public:
// char num/ . / e/+ /other
enum charType{
charNum=0,
charDot=1,
charE=2,
charSig=3,
charOther=4
};
enum typeState{
S_init=0,
numSigSat,
FirstDotSat, //用于检查DOt是否在数字前出现 因为出现Dot后不能在有第二个Dot
PrueNumSat,//ok
numWithdotOKSat,//ok with dot
HasE,
ESig,
Enum //ok
};
std::unordered_map<int, std::unordered_map<int,int> > StateFunction =
{
{
S_init,{
{charSig,numSigSat},
{charDot,FirstDotSat},
{charNum,PrueNumSat}
}},
{
numSigSat,{
{charDot,FirstDotSat},
{charNum,PrueNumSat}
}},
{
FirstDotSat,{
{charNum,numWithdotOKSat}
}},
//ok
{
PrueNumSat,{
{charNum,PrueNumSat},
{charDot,numWithdotOKSat},
{charE,HasE}
}
},
//ok
{
numWithdotOKSat,{
{charNum,numWithdotOKSat},
{charE,HasE}
}
},
{
HasE,{
{charSig,ESig},
{charNum,Enum}
}},
{
ESig,{
{charNum,Enum}
}},
{
Enum,{
{charNum,Enum}
}},
};
charType detectChar(char c)
{
if(c>='0' && c<='9' ) return charNum;
if(c=='.') return charDot;
if(c=='E' || c=='e') return charE;
if(c=='+' || c=='-') return charSig;
return charOther;
}
bool isNumber(string s) {
// 1.23e-5
// // space num . e + -
// init state
// |+
// numSat1
// |.
// numSat2
// |nu3
// numSat23
// before E state
// |e
// HasE state
// | + | num
// Enum eOK
// |num eOK
// filter space 5 classes of char num/ . / e/+ /other
// return s.erase(0,s.find_first_not_of(drop));
//e.g " 0123 " remove space ==> |012|
s.erase(0,s.find_first_not_of(" "));
// std::cout<<"|" << s << "|"<< std::endl;
s.erase(s.find_last_not_of(" ")+1);
// std::cout<<"|" << s << "|"<< std::endl;
auto curState= S_init;
for(const auto & c : s)
{
auto myCharType= detectChar(c);
auto it= StateFunction[curState].find(myCharType);
if(it != StateFunction[curState].end() ) curState= (typeState)it->second;
else return false;
// std::cout << curState << std::endl;
}
return curState== PrueNumSat || curState==numWithdotOKSat || curState== Enum;
}
};
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
若干空格
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
示例 1:
输入:s = "0"
输出:true
示例 2:
输入:s = "e"
输出:false
示例 3:
输入:s = "."
输出:false
示例 4:
输入:s = " .1 "
输出:true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。