题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
知识点:
正则表达式:
\d:数字字符匹配,0-9.
[eE]:匹配e或E,匹配括号中任意一个字符
\\+,\\-:+,-
*:出现0次或多次
+:出现一次或多次
?:是否发生
注意:\\+代表+号,\+代表出现一次或多次的+;\:将下一个字符定为标记符。
思路:
方法一:正则表达式
[\\+\\-]?:+或-号是否出现;\\d*:数字出现0或多次;(\\.\\d+)?:.若出现后面数字至少出现一次;([eE][\\+\\-]?\\d+)?:e或E出现,+或-出现,后面数字至少出现一次。
方法二:正常比较法
1、将str下标单独标出,建立判断的flag(boolean类型);
2、首先判断是否有+-号的出现
3、当.出现,判断后面是否有数字||前面有数字(flag标记)
4、当有E或e出现,判断后面是否有+-和数字&&前面一定有数字(flag标记)
5、结果为flag&&下标到最后
答案:
public class Solution {
public boolean isNumeric(char[] str) {
String s = String.valueOf(str);
return s.matches("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");//正则表达式方法
}
}
public class Solution {
private int index = 0;
public boolean isNumeric(char[] str) {
//正常判断
if(str.length==0){return false;}
boolean flag = scanInteger(str);//开头是否有+-号,并且+-号后面是否有数字
if(index<str.length && str[index]=='.'){
index++;
//flag = flag || scanUnsignedInteger(str);//有短路特性,若flag为true,后面就不判断了
flag = scanUnsignedInteger(str) || flag;//.前后至少出现一次数字
}
if(index<str.length && (str[index]=='e' || str[index]=='E')){
index++;
flag = flag && scanInteger(str);//如果e前面不是数字,短路特性,直接排除
}
return flag && index==str.length;
}
public boolean scanInteger(char[] str){//判断是否有+-号
if(index<str.length && (str[index]=='+' || str[index]=='-')){
index++;
}
return scanUnsignedInteger(str);
}
public boolean scanUnsignedInteger(char[] str){//判断是否有数字
int start = index;
while(index<str.length && str[index]>='0' && str[index]<='9'){
index++;
}
return start<index;
}
}