题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。
题解
笔记(参考力扣题解)
思路:
1)先去除字符串首尾的空格
2)然后根据e划分指数和底数
3)判断指数和底数是否合法即可
int i = s.find_first_not_of(' ');//找到字符串中第一个不是' '的下标
int j = s.find_last_not_of(' ');//找到字符串中最后一个不是' '的下标
if(e==string::npos)等同于if(e==-1)//没找到
代码:
class Solution {
public:
bool isNumber(string s) {
//judge s is empty or not
int i = s.find_first_not_of(' ');
if(i==-1) return false;
int j = s.find_last_not_of(' ');
s = s.substr(i,j-i+1);
if(s.empty()) return false;
//split digit and index according to e
int e = s.find('e');
if(e==string::npos)//等价于e==-1没找到
return judgeDigit(s);
else
return
//整数部分从0下标开始,长度为下标[e-1]-0+1=e;指数部分从e+1下标开始,长度为 [s.size()-1] - (e+1) + 1 = s.zies()-1-e
judgeDigit(s.substr(0,e))&&judgeIndex(s.substr(e+1,s.size()-1-e));
//下面同上,指数部分的substr(e+1)指砍去包括e下标和之前的字符串,取e+1下标之后的部分
//judgeDigit(s.substr(0,e))&&judgeIndex(s.substr(e+1));
}
bool judgeDigit(string s){
cout<<"digit is: "<<s<<endl;
bool isdot = false;
bool res = false;
for(int i=0;i<s.size();i++){
if(s[i]=='-'||s[i]=='+'){
if(i!=0)//符号位不在第一位,返回false
return false;
}
else if(s[i]=='.'){
if(isdot)//如果之前已经出现过小数点,返回false
return false;
isdot = true;
}
else if(s[i]<'0'||s[i]>'9')
return false;
else
res = true;
}
return res;
}
bool judgeIndex(string s){
cout<<"index is: "<<s<<endl;
bool res = false;
for(int i=0;i<s.size();i++){
if(s[i]=='-'||s[i]=='+'){
if(i!=0)
return false;
}
else if(s[i]<'0'||s[i]>'9')//注意指数不能出现小数点,所以出现除符号位的非纯数字均表示指数不合法
return false;
else
res = true;
}
return res;
}
};