题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100","5e2","-123","123.e+10","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
方法一:模拟,字符串处理 O(n)
具体思路如下:
先去除行首和行尾空格。
行首如果有一个正负号,直接忽略。
如果字符串为空或只有一个 '.' ,则不是一个合法数。
循环整个字符串,去掉以下几种情况:
(1) '.' 或 'e' 多于 1 个。
(2) '.' 在 'e' 后面出现。
(3) 'e' 后面或前面为空,或者 'e' 前面紧跟着 '.' 。
(4) 'e' 后面紧跟着正负号,但正负号后面为空。
剩下的情况都合法
class Solution { public: bool isNumber(string s) { //先删除行头和行尾的空格 int i = 0; while (i < s.size() && s[i] == ' ') i++; int j = s.size() - 1; while (j >= 0 && s[j] == ' ') j--; if (i > j) return false; //字符串不能为空 s = s.substr(i, j - i + 1); if (s[0] == '-' || s[0] == '+') s = s.substr(1); //去掉开头正负号 if (s.empty() || s[0] == '.' && s.size() == 1) return false; //不能为空且不能只有'.' int dot = 0, e = 0; //分别记录点的数量和e的数量 for (i = 0; i < s.size(); i++) { if (s[i] >= '0' && s[i] <= '9'); else if (s[i] == '.') { dot++; //'.'数量不能大于1且其前面不能有e或E if (dot > 1 || e) return false; } else if (s[i] == 'e' || s[i] == 'E') { e++; //e或E前面后面不能没有数字,且其数量不能大于1,且'.e'或'.E'前要有数字 if (i + 1 == s.size() || !i || e > 1 || i == 1 && s[0] == '.') return false; if (s[i + 1] == '-' || s[i + 1] == '+') { //e或E后面不能没有数字 if (i + 2 == s.size()) return false; i++; } } else return false; } return true; } };
欢迎大家在评论区交流~