Validate if a given string is numeric.
Some examples:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
主要就是判断一个字符串是不是一个数字,这个题目不是很难,主要是要把所有的情况理清楚
首先有一些情况是允许的
1. 前后空格
2. "+","-"号
3. "1.", ".34","+.1"也被认为是正确的
然后就是常规的情况
比如出现两个 e 或者E 或者两个小数点是不对的,比如E后面没有数字是不对的
class Solution { public: bool isNumber(const char *s) { if(s==NULL) return false; int i=0; int j=strlen(s)-1; while(s[i]==' ') i++; while(j>=0 && s[j]==' ') j--; if(i>j) return false; string str(s+i,j-i+1); //<初始化处理之后的字符串 int e; bool hasE = false; for(int i=0;i<str.length();i++) if(str[i]=='e' || str[i]=='E'){ if(hasE) return false; //<出现多个e else{ hasE=true; e=i; //<记录e出现的位置 } } if(hasE){ string str1(str.begin(),str.begin()+e); string str2(str.begin()+e+1,str.end()); return isNumberWithoutE(str1) && isSignNumber(str2); //<出现e,将其前后划分为两数据 } return isNumberWithoutE(str); //<直接对该字符串检查 } bool isNumberWithoutE(string s){ if(s.length()==0) return false; if(s[0]=='+' || s[0]=='-') s = string(s.begin()+1,s.end()); if(s.length()==0) return false; int dot; bool hasDot = false; for(int i=0;i<s.length();i++){ if(s[i]=='.'){ if(hasDot) //<出现多个小数点 return false; else{ hasDot=true; dot=i; } } } if(hasDot){ string str1(s.begin(),s.begin()+dot); string str2(s.begin()+dot+1,s.end()); if(str1.length()==0 && str2.length()==0) return false; if(str1.length()==0) return isPureNumber(str2); if(str2.length()==0) return isPureNumber(str1); return isPureNumber(str1) && isPureNumber(str2); //<根据小数点将数据分开,进行检查 } return isPureNumber(s); } bool isSignNumber(string s){ if(s.length()==0) return false; if(s[0]=='+' || s[0]=='-') s = string(s.begin()+1,s.end()); return isPureNumber(s); } bool isPureNumber(string s){ if(s.length()==0) return false; for(int i=0;i<s.length();i++) if(s[i]<'0' || s[i]>'9') return false; return true; } };
时间: 2024-11-05 12:34:37