表示数值的字符串

解题思路

  • 使用有限状态机 关键在于理清状态个数,尤其是检查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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted @ 2021-05-15 22:49  boyang987  阅读(66)  评论(0编辑  收藏  举报