LeetCode: Valid Number [066]

【题目】

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.

【题意】

判断一个字符串是否是合法的数字

【思路】

合法的数字包括:

(1) 1, -1, +1, 0, +0, -0

(2) 0.1, -0.1, +0.1

(3) .1, +.1, -.1

(4) 1., +1., -1.

(5) 上面4种情况与e|E的组合,e|E右边只能是整数。 也就是说小数点最多只能出现1次,且必须出现在E的左边

评判规则:

1. 只能包含数字、小数点、正负号、E|e,头尾能包含空格

2. e的前后必须有数字

3. e的前面可以是小数,后面必须是整数

4. e的前后都可以有正负号

5. 小数点两边至少有一边是数字

【代码】

class Solution {
public:

    bool isNumber(const char *s) {
        if(s==NULL)return false;
        int len=strlen(s);
        int p1=0, p2=len-1;
        bool hasDot=false;  //标记小数点是否已经出现过
        bool hasSign=false;  //标记正负号是否已经出现过
        bool hasE=false;    //标记e是否已经出现过

        while(p1<=p2&&s[p1]==' ')p1++;
        while(p1<=p2&&s[p2]==' ')p2--;
        if(p1>p2)return false;  //去掉首尾的空格

        //第一个字符可以是数字,小数点,正负号
        if(!(isdigit(s[p1]) || s[p1]=='-' || s[p1]=='+' || s[p1]=='.')) return false;
        else{
            if(s[p1]=='-' || s[p1]=='+'){
                hasSign=true;
                if(p1>=p2 || (s[p1+1]!='.' && !isdigit(s[p1+1])))return false;  //如果正负号出现在第一位,则其后必须是小数点或者数字
            }
            else if(s[p1]=='.') {
                hasDot=true;
                if(p1>=p2 || !isdigit(s[p1+1])) return false;//如果小数点出现在第一位,则他的后面必须出现数字。
            }
            p1++;
        }
        //最后一个字符必须是数字或者小数点
        if(!isdigit(s[p2]) && s[p2]!='.')return false;

        while(p1<=p2){
            if(isdigit(s[p1])){
                p1++;
            }
            else if(s[p1]=='-' || s[p1]=='+'){
                //e的前后都能出现正负号,如果E已经出现过,则此时还能出现一次正负号。因此需要把标志位恢复成初始状态。
                if(hasE)hasSign=false;
                if(hasSign)return false;    //如果已经出现过正负号,则再出现是非法的
                if(s[p1-1]!='e' && s[p1-1]!='E') return false;  //正负号只可能出现在第一位或者紧跟着e出现
                if(p1>=p2 || (s[p1+1]!='.' && !isdigit(s[p1+1])))return false;  //正负号后必须是小数点或者数字
                hasSign=true;
                p1++;
            }
            else if(s[p1]=='.'){
                if(hasDot)return false; //小数点最多只能出现一次,且必须出现在e之前
                if(hasE)return false;   //小数点只能出现在E之前
                if(p1==p2 && !isdigit(s[p1-1])) return false;
                if(p1<p2 && !isdigit(s[p1-1]) && !isdigit(s[p1+1]))return false; //小数点前后必须至少有一个位置出现数字。
                hasDot=true;
                p1++;
            }
            else if(s[p1]=='e' || s[p1]=='E'){
                if(hasE)return false;   //E只能出现一次
                if(s[p1-1]!='.' && !isdigit(s[p1-1]))return false;  //e前面必须是小数点或者数字
                if(s[p1+1]!='+' && s[p1+1]!='-' && !isdigit(s[p1+1]))return false;  //e后面必须是正负号,或者数字
                hasE=true;
                p1++;
            }
            else return false;
        }

        return true;

    }
};

LeetCode: Valid Number [066]

时间: 2024-12-21 00:58:30

LeetCode: Valid Number [066]的相关文章

[leetcode]Valid Number @ Python

原题地址:http://oj.leetcode.com/problems/valid-number/ 题意:判断输入的字符串是否是合法的数. 解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较优雅.本文参考了http://blog.csdn.net/kenden23/article/details/18696083里面的内容,在此致谢! 首先这个题有9种状态: 0初始无输入或者只有space的状态1输入了数字之后的状态2前面无数字,只输入了dot的状态3输入了符号状态4前面有数字和有do

LeetCode: Valid Number 解题报告

Valid NumberValidate if a given string is numeric. Some examples:"0" => true" 0.1 " => true"abc" => false"1 a" => false"2e10" => trueNote: It is intended for the problem statement to be ambi

LeetCode——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.

[leetcode]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 ambi

LeetCode—*Valid Number

Validate if a given string is numeric. Some examples: "0" => true " 0.1 " => true "abc" => false "1 a" => false "2e10" => true 主要就是判断一个字符串是不是一个数字,这个题目不是很难,主要是要把所有的情况理清楚 首先有一些情况是允许的 1. 前后空格 2

[LeetCode] 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

LeetCode --- 65. Valid Number

题目链接: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 statemen

Valid Number leetcode java

题目: 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 ambigu

【leetcode刷题笔记】Valid Number

Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => true"abc" => false"1 a" => false"2e10" => true 题解:题目不难,就是有点麻烦,要注意的地方很多,总结一下: 前面和后面的空格要用s.trim()去掉: 前导的'+'和'-'号需要忽略: