题目描述很简单,判断一个数是否为正确数字的格式,如下:
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.
Hint:
1. 指数符号有“e”和“E”。
2. 前后空格不会影响数字,但中间空格会。
3. 如果小数点前没有数字,但是后面有,其实也是数字。同理后面也一样。
4. 比较容易想到的方法是按顺序判断。
一般大多数人(包括我自己)都会想到按顺序判断,即一步步判断每一个符号,如果不符合要求就return false。这样的话就会调用很多个ifor和if语句,造成代码紊乱且不易于阅读。更重要的是,这样很容易会疏漏一些特殊情况,于是就会这边加几个if那边加几个if,纯粹靠的是随即输入时的运气。
这里比较推荐standard answer的做法,先不废话,show the code:
- #include<string>
- enumInput {
- INVALID,// 0, 无效输入
- SPACE,// 1, 空格
- SIGN,// 2, 符号
- DIGIT,// 3, 数字
- DOT,// 4, 小数点
- EXPONENT// 5, 指数
- };
- enumState {
- START,// 0,开始状态,可输入空格、数字、符号、小数点。
- SIGNS,// 1,输入一个符号后的状态。
- DOTFIRST,// 2,小数点前无数字
- DIGITS,// 3, 输入数字
- DOTS,// 4, 小数点后数字
- EXP,// 5, 指数输入
- EXPDIGIT,// 6, 指数
- EXPSIGN,// 7, 指数符号
- END// 8, 后面的多余空格
- };
- bool isNumber(std::string s) {
- int transTable[][6]= {
- -1,0, 1, 3,2, -1,
- -1,-1,-1,3, 2, -1,
- -1,-1,-1,4, -1,-1,
- -1,8, -1,3, 4, 5,
- -1,8, -1,4, -1,5,
- -1,-1,7, 6, -1,-1,
- -1,8, -1,6, -1,-1,
- -1,-1,-1,6, -1,-1,
- -1,8, -1,-1,-1,-1
- };
- int state= 0;
- Input input= INVALID;
- int length= s.length();
- for(int i= 0; i< length; i++){
- char temp= s[i];
- if(temp ==' ') {
- input= SPACE;
- }else if(temp =='+' || temp== '-'){
- input= SIGN;
- }else if(temp >='0'&& temp <='9'){
- input= DIGIT;
- }elseif (temp== '.'){
- input= DOT;
- }else if(temp =='e' || temp== 'E'){
- input= EXPONENT;
- }else if(temp =='+' || temp== '-'){
- input= SIGN;
- }else {
- input= INVALID;
- }
- state= transTable[state][input];
- if(state ==-1){
- returnfalse;
- }
- }
- return state== 3|| state ==4 || state== 6|| state ==8;
- }