剑指 Offer 20. 表示数值的字符串
先附上题解:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/cmo-ni-ti-si-lu-jian-dan-luo-ji-qing-xi-by-xiaonen/
判断指数和非指数
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');
int E=s.find('E');
if(e!=-1&&E!=-1) return false;
e=max(e,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;
}
};
模拟
class Solution {
public:
int strToInt(string str) {
long long ans=0;
int i=str.find_first_not_of(' ');
if(i==string::npos)return false;
int j=str.find_last_not_of(' ');
str=str.substr(i,j-i+1);
if(str.size()==0) return 0;
int positive=0;
int negative=0;
if(str[0]=='-') negative++;
else if(str[0]=='+') positive++;
else if(str[0]<='9'&&str[0]>='0') ans=(str[0]-'0');
else return 0;
for(int i=1;i<str.size();i++){
if(str[i]>'9'||str[i]<'0')
break;
if(ans>INT_MIN&&ans<INT_MAX) ans=ans*10+(str[i]-'0');
}
//if(positive+negative>1) return 0;
if(negative==1) ans=-ans;
if(ans>INT_MAX) ans=INT_MAX;
else if(ans<INT_MIN) ans=INT_MIN;
return ans;
}
};