Valid Number

来源:互联网 发布:围攻龙刃堡 mac 编辑:程序博客网 时间:2024/05/16 14:54

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.

判断给定字符串是否表示数字。

其实一开始我也没考虑全,代码是边跑边补充的,也就是说,从一开始个的这5个examples开始写,把自己能想到的先写入代码里,测试是否通过。

当然肯定不可能通过,观察不能通过的测试用例有什么特点是自己的代码里没有的。

比如一开始我们知道:

1、带有字母必定return false,e除外。

2、小数点只能有一个

3、不能带有空格

到后面出现的一些测试用例开始补充:

4、“-1”  “+0.8” 说明要把正负号考虑进去

5、“                1” “2            ”像这样的也能够表示数字,也就是说考虑空格,与第三点不同,我将这样的空格不当做空格,意思就是只有当空格前后都有非空格的字符时,才认定为我所定义的空格,只要出现我所定义的空格就判断为 false

6、结合4和5这两点,我们知道正负号不一定在字符串最开头 也就是说 “       -1”像这样前面存在空格的也应该判断为 true

7、“3567e+9” 比如这样的正负号出现在e的后面,因此除了判断是否为整体的正负,还有判断是不是e后面的正负号,因此在出现第一个字符e时,要将位置记录

等等。。。我就不一一列出来了,根据个人的代码补充,出现的不通过的例子不完全相同,只要不断根据不通过的用例补充代码,最终就完成了。

代码如下:

    bool isNumber(string s) {/*num是否有数字,space是否有空格,realstart开头为空格时真正开始的位置,point是否有小数点,h表示后面,m表示前面,pointh表示小数点后是否有合理字符,pointm表示小数点前是否有合理字符,e是否有e,eh与em同理,ep为e的位置(判断正负号的位置是否合理)*/        bool num = false;        bool space = false;        int realstart = 0;        bool point = false;        bool pointh = false;        bool pointm = false;        bool e = false;        bool eh = false;        bool em = false;        int ep = -1;        for(int i = 0; i < s.size(); ++i){            if(space){                if(s[i] == ' '){//连续空格                    continue;                }                else{                    return false;                }            }            /////////////////////////////////////////////////////////////////////////            if(s[i] == '-' || s[i] == '+'){///正负号                if(i != realstart && i != ep + 1){                    return false;                }                else{                    if(i+1 == s.size() || s[i+1] > '9' || s[i+1] < '0' && s[i+1] != '.'){                        return false;                    }                }            }            else if(s[i] <= '9' && s[i] >= '0'){//数字                num = true;            }            else if(s[i] == ' '){//空格                if(i-1 >= 0 && s[i-1] != ' '){                    space = true;                }                else{                    if(!space){                        realstart++;                    }                }            }            else if(s[i] == '.'){//小数点                if(point || e){                    return false;                }                else{                    point = true;                    if(i+1 != s.size() && s[i+1] <= '9' && s[i+1] >= '0'){                        pointh = true;                    }                    if(i-1 >=0 && s[i-1] <= '9' && s[i-1] >= '0'){                        pointm = true;                    }                }            }            else if(s[i] == 'e'){//科学计数e                if(e){                    return false;                }                else{                    e = true;                    ep = i;                    if(i+1 != s.size() && s[i+1] != '.' && s[i+1] != ' '){                        eh = true;                    }                    if(i-1 >= 0 && ((s[i-1] <= '9' && s[i-1] >= '0') || s[i-1] == '.')){                        em = true;                    }                }            }            else{                return false;            }        }        if(point){            if(!pointm && !pointh){                return false;            }        }        if(!num){            return false;        }        if(e){            if(!em || !eh){                return false;            }        }        return true;    }