题目传送地址: https://leetcode.cn/problems/valid-number/
运行效率图:
代码如下:
class Solution {
public static boolean isNumber(String s) {
//先把字符串里面的E替换成e
s = s.replace("E", "e");
//处理边界情况
if (s.length() == 1) {
char c = s.charAt(0);
return c >= '0' && c <= '9';
}
int eIndex = -1;
if (s.contains("e")) {
eIndex = s.indexOf("e");
}
//那说明该数只能是整数或者小数
if (eIndex == -1) {
boolean validSmallPoint = validSmallPoint(s);
if (!validSmallPoint) {
return false;
}
boolean a = isDecimal(s);
boolean b = isIntegerNum(s);
return a || b;
}
//如果有e,那就把字符串分成2部分,以e或者E为分界线
//有多个e,那也不行
if (s.indexOf("e") != s.lastIndexOf("e")) {
return false;
}
String preStr = s.substring(0, eIndex);
String sufStr = s.substring(eIndex + 1);
if ("".equals(preStr)) { //e的前面必须要有数字才行
return false;
}
boolean validSmallPoint = validSmallPoint(preStr);
if (!validSmallPoint) {
return false;
}
boolean a = isDecimal(preStr);
boolean b = isIntegerNum(preStr);
boolean c = isIntegerNum(sufStr);
return (a || b) && c;
}
/**
* 判断字符串中是否包含多个点
*
* @param s
* @return
*/
public static boolean validSmallPoint(String s) {
int i = s.indexOf(".");
int i1 = s.lastIndexOf(".");
return i == i1;
}
/**
* '
* 判断字符是不是小数
*
* @param s
* @return
*/
public static boolean isDecimal(String s) {
//如果不含小数点,那肯定不是小数
if (!s.contains(".")) {
return false;
}
//如果字符串只有一个字符,那该字符必须要是数字才行
if (s.length() == 1) {
char c = s.charAt(0);
//判断字符是不是数字
return c >= '0' && c <= '9';
}
for (int i = 0; i < s.length(); i++) {
boolean otherLetter = true;
char c = s.charAt(i);
//判断字符是不是数字
if (c >= '0' && c <= '9') {
otherLetter = false;
}
//如果字符是 .
if (c == '.') {
//点号的前面跟着数字或者后面跟着数字,才行。 反正不能是孤立无援的点
//①点号的前面有位置,必须要是数字或者+号或者-号才行
if (i > 0) {
char preChar = s.charAt(i - 1);
//如果前一个字符是+或-,那点号后面必须要跟一个数字
if (preChar == '+' || preChar == '-') {
if (i + 1 >= s.length()) {
return false;
}
char nextChar = s.charAt(i + 1);
if (nextChar < '0' || nextChar > '9') {
return false;
}
}
if (preChar != '+' && preChar != '-' && (preChar < '0' || preChar > '9')) {
return false;
}
}
//②点号的后面有位置,必须要是数字才行
if (i + 1 < s.length()) {
char nextChar = s.charAt(i + 1);
if (nextChar < '0' || nextChar > '9') {
return false;
}
}
otherLetter = false;
}
//如果字符是+或-
if (c == '+' || c == '-') {
//+,-号只能放在第一个位置
if (i > 0) {
return false;
}
otherLetter = false;
}
if (otherLetter) { //如果是其他特殊字符,那肯定不行
return false;
}
}
return true;
}
/**
* '
* 判断字符是不是整数
*
* @param s
* @return
*/
public static boolean isIntegerNum(String s) {
try {
Long.parseLong(s);
} catch (Exception e) {
return false;
}
return true;
}
}