题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
- 若干空格
- 一个 小数 或者 整数
- (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
- 若干空格
小数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(’+’ 或 ‘-’)
- 下述格式之一:
至少一位数字,后面跟着一个点 ‘.’
至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
一个点 ‘.’ ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(’+’ 或 ‘-’)
- 至少一位数字
部分数值列举如下:
["+100", “5e2”, “-123”, “3.1416”, “-1E-16”, “0123”]
部分非数值列举如下:
[“12e”, “1a3.14”, “1.2.3”, “±5”, “12e+5.4”]
示例 1:
输入:s = “0”
输出:true
示例 2:
输入:s = “e”
输出:false
示例 3:
输入:s = “.”
输出:false
示例 4:
输入:s = " .1 "
输出:true
太繁琐了这个题目,提交了好多遍,完全是根据没有通过的样例改代码。
- 首先去掉首尾字符串的空白字符,其次如果第一个字符是负号位先去掉该位,如果去掉之后,字符串变成空或者字符串只剩一个字符且该字符出现‘.’ 返回false。错误样例(“+.”,“-.” ,"+" “ ”)
- 其次这下除了0~9十个数字还有e还有“.” ,“+”,“-”可以出现外,其余字符都不可以出现。错误样例(“e”, “e0” , “0e”, “e+”, “e-”, “6ee69”, “e.”, “.e.”,"…")
正确样例:" 005047e+6"
class Solution {
public:
bool isNumber(string s) {
int k = 0;
while(k < s.size() && s[k]==' ') k++;
int j = s.size() - 1;
while (j >= 0 && s[j] == ' ') j -- ;
s=s.substr(k,j-k+1);
if(s[0]=='+' || s[0]=='-') s=s.substr(1);
if(s.empty() || s[0]=='.' && s.size()==1) return false;
int n = s.size();
int dot=0,e=0;
for(int i=0;i<n;i++)
{
if(s[i]>='0' && s[i]<='9') continue;
else if(s[i]=='.')
{
dot++;
if(e || dot > 1) return false;
}
else if(s[i]=='e'||s[i]=='E')
{
e++;
if(e>1) return false;
if(i+1==s.size() || !i ||s[i-1]=='.'&& i-1==0) return false;
// if(i==0||s[0]=='.') return false;
if(s[i + 1] == '+' || s[i + 1] == '-')
{
if (i + 2 == s.size()) return false;
i ++ ;
}
}
else return false;
}
return true;
}
};
class Solution {
public:
bool isNumber(string s) {
int k=0;
while(s[k]==' ') k++;
int j=s.size()-1;
while(s[j]==' ') j--;
s=s.substr(k,j-k+1);//去掉字符串前后的空格
if(s[0]=='+' || s[0]=='-') s=s.substr(1);//去掉只包含+ 或者 - 的
if(s.empty()||s.size()==1 && s[0]=='.') return false;//去掉只包含.的 去掉啥也没有的
int dot=0,e=0;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9') continue;
else if(s[i]=='.')
{
dot++;
if(e || dot>1) return false;//去掉包含两个. 或者 e后面不是整数的字符串
}
else if(s[i]=='e'||s[i]=='E')
{
e++;
if(e>1) return false;//去掉包含多个e的
if(!i || i+1 ==s.size() || i-1==0 && s[i-1]=='.') return false;//去掉 e .e 以e结尾的如12e
if(s[i+1]=='+' || s[i+1]=='-')
{
if(i+2==s.size()) return false;//去掉 e+ e-
i++;
}
}
else return false;
}
return true;
}
};