LeetCode: 65.Valid Number

来源:互联网 发布:机床的重要性 知乎 编辑:程序博客网 时间:2024/06/09 20:42

LeetCode: 65.Valid Number

题目描述

Validate if a given string is numeric.
Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

题目大意: 实现判断给定字符串是否是一个数字的函数

解题思路

根据数字的相关定义, 画出状态转换图, 然后打表或对每个状态写个函数都可以解决。转换图如下:

LeetCode/ValidNumber

AC代码

class Solution {public:    bool Start(const string& s, size_t pos)    {        if(s.empty()) return false;        if(s[pos] == '+' || s[pos] == '-')       // +/- number        {            return StatusC(s, pos+1);        }        else if(s[pos] >= '0' && s[pos] <= '9')  // number        {            return StatusEndA(s, pos+1);        }        else if(s[pos] == '.')                   // .number        {            return StatusG(s, pos+1);        }        else         {            return false;        }    }    bool StatusEndA(const string& s, size_t pos)    {        if(pos == s.size()) return true;        if(s[pos] =='.')        {            return StatusEndB(s, pos+1);        }        else if(s[pos] == 'e')        {            return StatusD(s, pos+1);        }        else if(s[pos] >= '0' && s[pos] <= '9')        {             return StatusEndA(s, pos+1);        }        else        {            return false;        }    }    bool StatusEndB(const string& s, size_t pos)    {        if(pos == s.size()) return true;        if(s[pos] == 'e')        {            return StatusD(s, pos+1);        }        else if(s[pos] >= '0' && s[pos] <= '9')        {             return StatusEndB(s, pos+1);        }        else        {            return false;        }    }    bool StatusC(const string& s, size_t pos)    {        if(pos == s.size()) return false;        if(s[pos] >= '0' && s[pos] <= '9')        {            return StatusEndA(s, pos+1);        }        else if(s[pos] == '.')        {            return StatusG(s, pos+1);        }        else        {            return false;        }    }    bool StatusD(const string& s, size_t pos)    {        if(pos == s.size()) return false;        if(s[pos] == '+' || s[pos] == '-')        {            return StatusE(s, pos+1);        }        else if(s[pos] >= '0' && s[pos] <= '9')        {            return StatusEndF(s, pos+1);        }        else        {            return false;        }    }    bool StatusE(const string& s, size_t pos)    {        if(pos == s.size()) return false;        if(s[pos] >= '0' && s[pos] <= '9')        {            return StatusEndF(s, pos+1);        }        else        {            return false;        }    }    bool StatusG(const string&s, size_t pos)    {        if(pos == s.size()) return false;        if(s[pos] >= '0' && s[pos] <= '9')        {            return StatusEndB(s, pos+1);        }        else        {            return false;        }    }    bool StatusEndF(const string& s, size_t pos)    {        if(pos == s.size()) return true;        if(s[pos] >= '0' && s[pos] <= '9')        {            return StatusEndF(s, pos+1);        }        else        {            return false;        }    }    bool isNumber(string s) {        size_t beg = s.find_first_not_of(' ');        size_t end = s.find_last_not_of(' ');        if(beg == s.npos || end == s.npos) return false;        s = s.substr(beg, end-beg+1);        return Start(s, 0);    }};
原创粉丝点击