alidate 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.
断断续续做了2小时,各种情况想不到,最后崩溃了……
由于科学计数法的引入,要考虑 '.' '-' '+''e'和数字的位置、个数关系。
如果能够了解以上的字符出现时在之前可以出现的字符都有哪些,这个问题就能够顺利解决。
最后贴上水码,以后再重新做一遍。
class Solution { public: bool isNumber(const char *s) { int i = 0; int flag_num = 0; //int flag_numa = 0; int flag_dot = 0; int flag_dota = 0; int flag_minus = 0; int flag_plus = 0; int flag_e = 0; int flag_ea = 0; int flag_blank = 0; int flag_blanka = 0; while(s[i]!=' ') { if(s[i] == ' ') { if(flag_num == 1|| flag_dot ==1 || flag_plus == 1)flag_blank = 1; i++; continue; } if(s[i] >= '0' && s[i] <= '9') { flag_num = 1; if(flag_e == 1)flag_ea = 1; if(flag_dot == 1)flag_dota = 1; if(flag_blank == 1)return 0; i++; continue; } if(s[i] == '.') { if(flag_dot == 1 || flag_blank == 1 ||flag_e == 1 )return 0; else flag_dot = 1; //if(s[i+1] == ' ')return 0; i++; continue; } if(s[i] == '-') { if(flag_minus == 1)return 0; if(flag_num == 1 && flag_e == 1 ); else if(flag_num == 1 || flag_dot == 1 )return 0; if(flag_minus == 0)flag_minus = 1; else { if(flag_num == 1)return 1; else flag_num = 1; } i++; continue; } if(s[i] == '+') { if(flag_ea == 1)return 0; if(flag_num == 0 && flag_plus == 0|| flag_num == 1&&flag_e == 1)i++; else return 0; //if(flag_dot == 1 && flag_num == 1)return 0 ; if( flag_dot ==1 && flag_e == 0)return 0; flag_plus = 1; continue; } if(s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z') if(s[i] == 'e' && flag_e == 0 && flag_num == 1 ) {i++;flag_e=1;} else return 0; } //if(s[i-1] == '.')return 0; if(flag_e == 1 && flag_ea == 1)return 1; if(flag_e == 1 && flag_ea == 0)return 0; if(flag_dot == 1 && flag_dota == 1)return 1; //if(flag_dot == 1 )return 0; if(flag_num == 1)return 1; else return 0; } };