题目描述
- 呃…比较恶心的一道题,需要读好题,分完情况再下手
- 有看到dalao用有限状态机来做,不过这边还是直接用了我自己的做法= =
思路 && 代码
- ps:这里没有参考题解的写法,用的是方便自己理解的写法,所以可能代码有冗余,不过复杂度是没问题的~
- s 分为三部分:part1 = 小数 || 整数,part2 = e/E,part3 = 整数;part23可选
- 新增两个函数:isInteger() 整数判断,以及 isDecimal() 小数判断
- 先来一个循环,找到第一个 e / E 的位置,作为 part 的分界点
- 然后对 part1 进行 小数 or 整数判断,对 part3 进行整数判断即可
- 注意:无论小数、整数,都需要有数字元素
class Solution {
public boolean isNumber(String s) {
s = s.trim();
if(s.length() == 0) {
return false;
}
char[] sArr = s.toCharArray();
int eIndex = s.length();
for(int i = 0; i < s.length(); i++) {
if(sArr[i] == 'e' || sArr[i] == 'E') {
eIndex = i;
}
}
boolean part1 = (isInteger(sArr, 0, eIndex - 1) || isDecimal(sArr, 0, eIndex - 1));
if(eIndex != s.length()) {
if(eIndex == s.length() - 1) {
return false;
}
part1 = part1 && isInteger(sArr, eIndex + 1, s.length() - 1);
}
return part1;
}
public boolean isInteger(char[] arr, int start, int end) {
int numsCount = 0;
int index = start;
if(arr[index] == '-' || arr[index] == '+') {
index++;
}
for(; index <= end; index++) {
if(arr[index] < '0' || arr[index] > '9') {
return false;
}
numsCount++;
}
return numsCount > 0;
}
public boolean isDecimal(char[] arr, int start, int end) {
int index = start;
if(arr[index] == '-' || arr[index] == '+') {
index++;
}
int pointNums = 0, numCount = 0;
for(; index <= end; index++) {
if(arr[index] == '.') {
pointNums++;
continue;
}
else if(arr[index] < '0' || arr[index] > '9') {
return false;
}
numCount++;
}
return pointNums == 1 && numCount != 0;
}
}