题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100"
,"5e2"
,"-123"
,"3.1416"
和"-1E-16"
都表示数值。
但是"12e"
,"1a3.14"
,"1.2.3"
,"+-5"
和"12e+4.3"
都不是。
注意:
小数可以没有整数部分,例如.123
等于0.123
;
小数点后面可以没有数字,例如233.
等于233.0
;
小数点前面和后面可以有数字,例如233.666
;
当$e$或$E$前面没有数字时,整个字符串不能表示数字,例如.e1
、e1
;
当$e$或$E$后面没有整数时,整个字符串不能表示数字,例如12e
、12e+5.4
;
数据范围
输入字符串长度 $[0,25]$。
字符串中不含空格。
样例:
输入: "0"
输出: true
代码+模拟思路
class Solution {
public:
bool isNumber(string s) {
int i = 0, j = s.size();
//数据里前面或后面可能有空格,所以要先去掉
while (i <= j && s[i] == ' ') i ++;
while (i <= j && s[j] == ' ') j --;
//提取把空格去掉后的字符串
s = s.substr(i, j - i + 1);
//排除"",".",的情况
if (s.size() == 0 || (s.size() == 1 && s[0] == '.'))
return false;
//如果前面有+或-的话,就直接弃掉
if (s[0] == '+' || s[0] == '-')
s = s.substr(1);
//d记录小数点的数量,e记录E或e的数量
int d = 0, e = 0;
for (int i = 0; i < s.size(); i ++)
{
//如果是数字就啥也不干
if (s[i] <= '9' && s[i] >= '0');
//是小数点
else if (s[i] == '.')
{
d ++;
/*
1.是否有1个以上的小数点(1.2.3)
2.e后是否有小数点(1e+0.1)
3.小数点后面是否没数字(+.)
*/
if (d > 1 || e || (!i && i + 1 == s.size()))
return false;
}
//是E或e
else if (s[i] == 'e' || s[i] == 'E')
{
e ++;
/*
1.出现大于1个的e(1ee)
2.e前没有数字(e1)
3.e后没有数字(1e)
4.e紧跟着小数点(.e)
*/
if (e > 1 || !i || i + 1 == s.size() || s[i - 1] == '.' && i == 1)
return false;
/*
e后面有+或-时,要看+或-后有没有数字(1e+)
然后要把加减号过掉
*/
if (s[i + 1] == '+' || s[i + 1] == '-')
{
if (i + 2 == s.size())
return false;
i ++;
}
}
//出现了奇奇怪怪的字符
else
return false;
}
return true;
}
};
好了,这篇题解到这里就结束了。感谢观看!Thanks♪(・ω・)ノ!!!
$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\mathcal{writer\enspace by \enspace acwing}$ : $\mathfrak{天元之弈}$