描述
思路
- 先判断空串的情况。
- 遍历字符前面的空格,将下标移到第一个不是空格的位置。遍历字符串后面的空格,将长度限制在最后一个空格。若是长度小于下标,说明全是空格。
- 剩余部分判断,开始找数字,判断是不是一个有符号的整数,优先判断符号,直到遇到非数字停止。
- 如果有小数点,那么开始判断小数点后是不是一个无符号的整数,也是遍历直到遇到非数字为止,出现小数点的话,小数点前和小数点后的数字任意有一即可。
- 若是出现字母e或者E,那么需要判断后面是不是一个有符号的整数,,也是遍历直到遇到非数字为止,e前后都要数字。
- 最后检查下标是不是遍历到了刚刚限制的长度,若是没有,说明后面还有非空格,不符合要求。
代码
#include<string>
using namespace std;
class Solution {
public:
//遍历字符串的下标
int index = 0;
//有符号判断
bool integer(string& s) {
if (index < s.length() && (s[index] == '-' || s[index] == '+'))
index++;
return unsigned_integer(s);
}
//无符号数判断
bool unsigned_integer(string& s) {
int temp = index;
while (index < s.length() && (s[index] >= '0' && s[index] <= '9'))
index++;
return index > temp;
}
bool isNumeric(string str) {
//判断空串
if (str.length() == 0)
return false;
//去除空格
while (index < str.length() && str[index] == ' ')
index++;
int n = str.length() - 1;
//去除字符串后面的空格
while (n >= 0 && str[n] == ' ')
n--;
//限制的长度比下标多1
n++;
//全是空格
if (n < index)
return false;
//判断前面的字符是否有符号的整数
bool flag = integer(str);
//如果有小数点
if (index < n && str[index] == '.') {
index++;
//小数点后有无数字
flag = unsigned_integer(str) || flag;
}
//如果有e
if (index < n && (str[index] == 'e' || str[index] == 'E')) {
index++;
//后面必须全是整数
flag = flag && integer(str);
}
//是否字符串遍历结束
return flag && (index == n);
}
};
Comments | NOTHING