题型: 普通题
没有使用特殊的算法,只是单纯的分类讨论
分类讨论
- 首先去点开头结尾的空格
- 若以 +, -开头则去掉得到新的字符串s
- 若s为空,或者s为单个点,则返回false
- 开始循环,循环变量为i,设置dot和e分别记录 . e/E出现的次数
- 若第i个字符为数字,则不做任何处理;
- 若第i个字符为.,则将dot加一,并判断dot是否大于1,e是否大于0,若是则返回false
- 若第i个字符为e/E,则e++,判断e前面和后面是否均为整数。若i等于0,或者i等于长度减1,或者i-1处为点则返回false
- 其他情况均,返回false
- 若循环结束后没有返回false,则返回true。
题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+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”
输出: true
java解法
class Solution {
public boolean isNumber(String s) {
int star = 0, end = s.length() - 1;
while (star <= end && s.charAt(star) == ' ') star++;
while (star <= end && s.charAt(end) == ' ') end--;
if (star > end) return false;
s = s.substring(star, end - star + 1);
// System.out.println(s);
if (s.charAt(0) == '+' || s.charAt(0) == '-') s = s.substring(1);
// 去掉单个的 '+', '-', '.'
if (s.length() == 0 || (s.charAt(0) == '.' && s.length() == 1)) return false;
int dot = 0, e = 0; // 记录 '.' 和 'e/E' 的出现次数
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >= '0' && s.charAt(i) <= '9'); // 如果是数字,则什么也不做
else if (s.charAt(i) == '.') {
// 当前字符是 '.'
dot++;
if (dot > 1 || e > 0) // 如果出现了多个点,或者点之前出现了e
return false;
}
else if (s.charAt(i) == 'e' || s.charAt(i) == 'E') {
// 当前字符为e、E
// e前面必须有整数, e后面必须有整数
e++;
if (i == 0 || i == s.length() - 1 || e > 1 || s.charAt(i-1) == '.') return false;
if (s.charAt(i + 1) == '+' || s.charAt(i+1) == '-') {
if (i + 2 == s.length()) return false;
i++;
}
}
else return false;
}
return true;
}
}