1 問題
請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串
"+100"
、"5e2"
、"-123"
、"3.1416"
、"0123"
都表示數值,但"12e"
、"1a3.14"
、"1.2.3"
、"+-5"
、"-1E-16"
及"12e+5.4"
都不是。
2 解題思路
- 先去除字符串首尾的空格
- 然後根據e劃分指數和底數
- 判斷指數和底數是否合法即可
3 代碼實現
class Solution {
public:
bool isNumber(string s) {
//1、從首尾尋找s中不爲空格首尾位置,也就是去除首尾空格
int i=s.find_first_not_of(' ');
if(i==string::npos)return false;
int j=s.find_last_not_of(' ');
s=s.substr(i,j-i+1);
if(s.empty())return false;
//2、根據e來劃分底數和指數
int e=s.find('e');
//3、指數爲空,判斷底數
if(e==string::npos)return judgeP(s);
//4、指數不爲空,判斷底數和指數
else return judgeP(s.substr(0,e))&&judgeS(s.substr(e+1));
}
bool judgeP(string s)//判斷底數是否合法
{
bool result=false,point=false;
int n=s.size();
for(int i=0;i<n;++i)
{
if(s[i]=='+'||s[i]=='-'){//符號位不在第一位,返回false
if(i!=0)return false;
}
else if(s[i]=='.'){
if(point)return false;//有多個小數點,返回false
point=true;
}
else if(s[i]<'0'||s[i]>'9'){//非純數字,返回false
return false;
}
else{
result=true;
}
}
return result;
}
bool judgeS(string s)//判斷指數是否合法
{
bool result=false;
//注意指數不能出現小數點,所以出現除符號位的非純數字表示指數不合法
for(int i=0;i<s.size();++i)
{
if(s[i]=='+'||s[i]=='-'){//符號位不在第一位,返回false
if(i!=0)return false;
}
else if(s[i]<'0'||s[i]>'9'){//非純數字,返回false
return false;
}
else{
result=true;
}
}
return result;
}
};
int main(int argc,char* argv[])
{
Solution sol;
bool res = sol.isNumber("+100-");
cout << res << endl;
system("pause");
return 0;
}
運行結果:
以上內容來自: