题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
【解法一】
思路:状态机实现,如下图所示

代码实现
public class Solution {
public boolean isNumeric(char[] str) {
//使用状态机求解
int i = 0;
//首字符合法性
if(i < str.length &&(str[i] == '+' || str[i] == '-' || str[i] == '.' || isNum(str[i]))){
//数字遍历
while((++i < str.length) && isNum(str[i]));
if(i == str.length){
//如果遍历完成
return true;
} else if(str[i] == '.'){
//数字遍历
while((++i < str.length) && isNum(str[i]));
if(i == str.length){
//如果遍历完成
return true;
} else if (str[i] == 'e' || str[i] == 'E'){
i++;
if(i < str.length &&(str[i] == '+' || str[i] == '-' || isNum(str[i]))){
//数字遍历
while((++i < str.length) && isNum(str[i]));
if(i == str.length)
return true;
else
return false;
} else {
return false;
}
} else
return false;
} else if(str[i] == 'e' || str[i] == 'E'){
i++;
if(i < str.length &&(str[i] == '+' || str[i] == '-' || isNum(str[i]))){
//数字遍历
while((++i < str.length) && isNum(str[i]));
if(i == str.length)
return true;
else
return false;
} else {
return false;
}
} else
return false;
} else
return false;
}
private boolean isNum(char str) {
if(str >= '0' && str <= '9') {
return true;
} else
return false;
}
}
【解法2】
思路:使用正则表达式
代码实现
public class Solution {
public boolean isNumeric(char[] str) {
//使用正则表达式
String s = String.valueOf(str);
return s.matches("[+-]?[0-9]*(\\.[0-9]*)?([eE][+-]?[0-9]+)?");
}
} 正则表达式的规则这里就不介绍啦~只能说正则表达式好强大!
更多算法解答请点击
《剑指offer》66题JAVA代码算法实现全集
|