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.
一开始也想用有限状态机了,后来想想不用也不会太麻烦。
需要注意各种Test Case:bool isNumber(const char *s) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
string num = s;
int i=0;
while(num[i]==' ')i++;
if(num[i]=='-' || num[i]=='+')i++;
int j=num.size()-1;
while(num[j]==' ')j--;
if(i<=j)
num = num.substr(i,j-i+1);
else return false;
int dot = -1;
int ee = -1;
for(int i=0; i<num.size(); i++)
{
if(dot == -1 && num[i] == '.')
dot = i;
else if(ee == -1 && num[i] == 'e'){
ee = i;
if(num[i+1] == '-' || num[i+1]=='+')
i++;
}
else{
int tmpnum = num[i]-'0';
if(0<=tmpnum && tmpnum<=9)continue;
else return false;
}
}
//xxx.xxexx
string startstr,midstr,laststr;
if(dot==-1 && ee==-1){//xxxx
startstr = num;
if(startstr.size()<1)return false;
}else if(dot!=-1 && ee==-1){//xxx.xxx
startstr = num.substr(0,dot);
midstr=num.substr(dot+1);//.1,2.,0.1,0.0,2.0
if(startstr.size()<1 && midstr.size()<1)
return false;
}else if(dot==-1 && ee!=-1){//xxxexxx
startstr = num.substr(0,ee);
if(startstr.size()<1)return false;
if(num[ee+1] == '-' || num[ee+1]=='+')
laststr = num.substr(ee+2);
else
laststr = num.substr(ee+1);
if(laststr.size()<1)return false;
}else{//xxx.xxexx
if(dot>ee)return false;
startstr = num.substr(0,dot);
midstr=num.substr(dot+1,ee-dot-1);
if(startstr.size()<1 && midstr.size()<1)
return false;
if(num[ee+1] == '-' || num[ee+1]=='+')
laststr = num.substr(ee+2);
else
laststr = num.substr(ee+1);
if(laststr.size()<1)return false;
}
return true;
}
All Test Cases:
Input | Output | Expected |
"3" | TRUE | TRUE |
"e" | FALSE | FALSE |
"1" | TRUE | TRUE |
"." | FALSE | FALSE |
"4" | TRUE | TRUE |
"0" | TRUE | TRUE |
" " | FALSE | FALSE |
"5" | TRUE | TRUE |
"2" | TRUE | TRUE |
"7" | TRUE | TRUE |
"9" | TRUE | TRUE |
"6" | TRUE | TRUE |
" ." | FALSE | FALSE |
"e9" | FALSE | FALSE |
"11" | TRUE | TRUE |
"1 " | TRUE | TRUE |
".1" | TRUE | TRUE |
"19" | TRUE | TRUE |
"01" | TRUE | TRUE |
".2" | TRUE | TRUE |
"e." | FALSE | FALSE |
"4 " | TRUE | TRUE |
"e1" | FALSE | FALSE |
" 0" | TRUE | TRUE |
"0e" | FALSE | FALSE |
".0" | TRUE | TRUE |
"3." | TRUE | TRUE |
"41" | TRUE | TRUE |
"e7" | FALSE | FALSE |
"5 " | TRUE | TRUE |
".6" | TRUE | TRUE |
".." | FALSE | FALSE |
"61" | TRUE | TRUE |
"65" | TRUE | TRUE |
"e0" | FALSE | FALSE |
"0." | TRUE | TRUE |
"80" | TRUE | TRUE |
"5e" | FALSE | FALSE |
"1e" | FALSE | FALSE |
"10" | TRUE | TRUE |
"17" | TRUE | TRUE |
"13" | TRUE | TRUE |
"1." | TRUE | TRUE |
"48" | TRUE | TRUE |
".5" | TRUE | TRUE |
"21" | TRUE | TRUE |
"00" | TRUE | TRUE |
". " | FALSE | FALSE |
"6e" | FALSE | FALSE |
"18" | TRUE | TRUE |
"e6" | FALSE | FALSE |
"15" | TRUE | TRUE |
"05" | TRUE | TRUE |
"56" | TRUE | TRUE |
"4." | TRUE | TRUE |
"73" | TRUE | TRUE |
"44" | TRUE | TRUE |
"03" | TRUE | TRUE |
"ee" | FALSE | FALSE |
"60" | TRUE | TRUE |
".e" | FALSE | FALSE |
"e3" | FALSE | FALSE |
"66" | TRUE | TRUE |
" e" | FALSE | FALSE |
"2e0" | TRUE | TRUE |
"210" | TRUE | TRUE |
"1e6" | TRUE | TRUE |
".20" | TRUE | TRUE |
"10e" | FALSE | FALSE |
"..2" | FALSE | FALSE |
". 1" | FALSE | FALSE |
"0.8" | TRUE | TRUE |
"4e0" | TRUE | TRUE |
"5.6" | TRUE | TRUE |
"151" | TRUE | TRUE |
"6.1" | TRUE | TRUE |
".15" | TRUE | TRUE |
"1 4" | FALSE | FALSE |
"114" | TRUE | TRUE |
"0.7" | TRUE | TRUE |
"936" | TRUE | TRUE |
".e1" | FALSE | FALSE |
"55e" | FALSE | FALSE |
"510" | TRUE | TRUE |
"0.." | FALSE | FALSE |
"e11" | FALSE | FALSE |
"010" | TRUE | TRUE |
"016" | TRUE | TRUE |
".0e" | FALSE | FALSE |
"1 0" | FALSE | FALSE |
"e81" | FALSE | FALSE |
"6e0" | TRUE | TRUE |
"1 " | TRUE | TRUE |
"605" | TRUE | TRUE |
".18" | TRUE | TRUE |
"e20" | FALSE | FALSE |
" 74" | TRUE | TRUE |
"e61" | FALSE | FALSE |
".80" | TRUE | TRUE |
"00e" | FALSE | FALSE |
" 9." | TRUE | TRUE |
"000" | TRUE | TRUE |
"1e." | FALSE | FALSE |
".91" | TRUE | TRUE |
"3. " | TRUE | TRUE |
"113" | TRUE | TRUE |
"005" | TRUE | TRUE |
"111" | TRUE | TRUE |
"041" | TRUE | TRUE |
". 0" | FALSE | FALSE |
".1." | FALSE | FALSE |
"861" | TRUE | TRUE |
"26." | TRUE | TRUE |
"1 ." | FALSE | FALSE |
"..." | FALSE | FALSE |
"101" | TRUE | TRUE |
".00" | TRUE | TRUE |
"316" | TRUE | TRUE |
".1e" | FALSE | FALSE |
"500" | TRUE | TRUE |
"01." | TRUE | TRUE |
"78." | TRUE | TRUE |
"3e1" | TRUE | TRUE |
"3.." | FALSE | FALSE |
"381" | TRUE | TRUE |
"315" | TRUE | TRUE |
".72" | TRUE | TRUE |
"1e9" | TRUE | TRUE |
"59." | TRUE | TRUE |
"110" | TRUE | TRUE |
"1.0" | TRUE | TRUE |
"0.1" | TRUE | TRUE |
"4.." | FALSE | FALSE |
"1.4" | TRUE | TRUE |
".2." | FALSE | FALSE |
" 9e" | FALSE | FALSE |
"811" | TRUE | TRUE |
"10." | TRUE | TRUE |
" 0e" | FALSE | FALSE |
"1.." | FALSE | FALSE |
"225" | TRUE | TRUE |
"00 " | TRUE | TRUE |
"341" | TRUE | TRUE |
"108" | TRUE | TRUE |
"1.1" | TRUE | TRUE |
"..0" | FALSE | FALSE |
"920" | TRUE | TRUE |
"150" | TRUE | TRUE |
".. " | FALSE | FALSE |
"008" | TRUE | TRUE |
"e44" | FALSE | FALSE |
"4e." | FALSE | FALSE |
"400" | TRUE | TRUE |
"1.3" | TRUE | TRUE |
"0e " | FALSE | FALSE |
"ee6" | FALSE | FALSE |
"3 " | TRUE | TRUE |
"46." | TRUE | TRUE |
"0.e" | FALSE | FALSE |
"235" | TRUE | TRUE |
"971" | TRUE | TRUE |
"ee." | FALSE | FALSE |
"171" | TRUE | TRUE |
" .9" | TRUE | TRUE |
" 0 " | TRUE | TRUE |
"1e1" | TRUE | TRUE |
"002" | TRUE | TRUE |
"3 6" | FALSE | FALSE |
"e.1" | FALSE | FALSE |
"0.0" | TRUE | TRUE |
"8.." | FALSE | FALSE |
"301" | TRUE | TRUE |
"7 1" | FALSE | FALSE |
"370" | TRUE | TRUE |
"6ee" | FALSE | FALSE |
".7." | FALSE | FALSE |
"070" | TRUE | TRUE |
"ee0" | FALSE | FALSE |
"01e" | FALSE | FALSE |
"761" | TRUE | TRUE |
"0e1" | TRUE | TRUE |
"130" | TRUE | TRUE |
"8 8" | FALSE | FALSE |
"0 0" | FALSE | FALSE |
"001" | TRUE | TRUE |
"911" | TRUE | TRUE |
"08." | TRUE | TRUE |
"009" | TRUE | TRUE |
"6 9" | FALSE | FALSE |
"700" | TRUE | TRUE |
"e12" | FALSE | FALSE |
"115" | TRUE | TRUE |
" 00" | TRUE | TRUE |
"11." | TRUE | TRUE |
".92" | TRUE | TRUE |
"801" | TRUE | TRUE |
"41." | TRUE | TRUE |
"170" | TRUE | TRUE |
"3.e" | FALSE | FALSE |
"900" | TRUE | TRUE |
"e0 " | FALSE | FALSE |
"175" | TRUE | TRUE |
"708" | TRUE | TRUE |
"1.7" | TRUE | TRUE |
".05" | TRUE | TRUE |
"e9e" | FALSE | FALSE |
"1.e" | FALSE | FALSE |
"0 ." | FALSE | FALSE |
"050" | TRUE | TRUE |
"1.8" | TRUE | TRUE |
"01 " | TRUE | TRUE |
"e1e" | FALSE | FALSE |
"41e" | FALSE | FALSE |
" e0" | FALSE | FALSE |
"100" | TRUE | TRUE |
"076" | TRUE | TRUE |
" 10" | TRUE | TRUE |
"18." | TRUE | TRUE |
"9e1" | TRUE | TRUE |
"e90" | FALSE | FALSE |
" ee" | FALSE | FALSE |
".9 " | TRUE | TRUE |
"8e " | FALSE | FALSE |
"961" | TRUE | TRUE |
"8ee" | FALSE | FALSE |
"05 " | TRUE | TRUE |
"5e4" | TRUE | TRUE |
"e51" | FALSE | FALSE |
"198" | TRUE | TRUE |
"0e3" | TRUE | TRUE |
"81." | TRUE | TRUE |
"934" | TRUE | TRUE |
"1. " | TRUE | TRUE |
" 06" | TRUE | TRUE |
"e01" | FALSE | FALSE |
"09 " | TRUE | TRUE |
"f.e" | FALSE | FALSE |
"85." | TRUE | TRUE |
"te1" | FALSE | FALSE |
"Re7" | FALSE | FALSE |
"3me" | FALSE | FALSE |
"5 " | TRUE | TRUE |
"D+ " | FALSE | FALSE |
"5.5" | TRUE | TRUE |
"e30" | FALSE | FALSE |
"Y+." | FALSE | FALSE |