LeetCode 第65题
总的思路,就是先根据小数点分割,再根据e来分割,判断分割后的字符串的合法性。
感觉代码逻辑还可以~
class Solution {
//count用来计数,如果包含小数点,记录是根据小数点分割的第几个字符串片段
int count = 0;
public boolean isNumber(String s) {
if(null == s || s.length() == 0) {
return false;
}
//防止多个.或者e的情况
if(s.indexOf(".") != s.lastIndexOf(".") || s.indexOf("e") != s.lastIndexOf("e")) {
return false;
}
if(s.contains(".")) {
if(s.length() == 1) {
return false;
}
String[] splitArr = s.split("\\.");
//防止.+的情况
if(splitArr.length == 1 && splitArr[0].length() == 1 && (splitArr[0].contains("+") || splitArr[0].contains("-"))) {
return false;
}
//防止.e的情况
if(splitArr.length == 2 && splitArr[0].length() == 0 && (splitArr[1].startsWith("E") || splitArr[1].startsWith("e"))) {
return false;
}
//防止e为在小数点之前的情况
if(splitArr[0].contains("e") || splitArr[0].contains("E")) {
return false;
}
//小数点分割出的每一段,都去做校验
for(String str : splitArr) {
if(!check(str, true)) {
return false;
}
count++;
}
}else {
if(!check(s, false)) {
return false;
}
}
return true;
}
//校验方法,能同时校验小数点分割的情况、没有小数点的情况
//flag作为是否产生小数点分割的标志位
public boolean check(String s, boolean flag) {
if(count == 0 && (s.startsWith("e") || s.startsWith("E"))) {
return false;
}
boolean eFlag = s.contains("e");
boolean EFlag = s.contains("E");
if(eFlag || EFlag){
String[] split = null;
if(eFlag) {
split = s.split("e");
}else {
split = s.split("E");
}
if(split.length != 2) {
return false;
}
for(String str : split) {
boolean symbolFlag = false;
if(str.startsWith("+") || str.startsWith("-")) {
symbolFlag = true;
}
int i = 0;
if(symbolFlag) {
i++;
}
for(; i < str.length(); i++) {
char charAt = str.charAt(i);
if(charAt < 48 || charAt > 57) {
return false;
}
}
//校验仅有单符号的情景,比如4e+
if(symbolFlag && str.length() == 1) {
return false;
}
}
}else {
boolean symbolFlag = false;
if(s.startsWith("+") || s.startsWith("-")) {
symbolFlag = true;
}
//如果这是根据小数点分割的第二个字符串,且以+号开头,则直接返回false。类似1.+56
if(count == 1 && symbolFlag && flag) {
return false;
}
int i = 0;
if(symbolFlag) {
i++;
}
//根据小数点,e分割完了之后,字符串片段中,不是开头的部分只能为数字,否则都是无效的
for(; i < s.length(); i++) {
char charAt = s.charAt(i);
if(charAt < 48 || charAt > 57) {
return false;
}
}
}
return true;
}
}
结果