题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。
但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
正则解法
思路:
- 正则表达式的解法,熟悉正则表达式的可以利用正则表达式解法
- 先判断是否有加减号一开始,然后后面跟着是不是数字,是就为true,不是false,
- 如果跟着e则说明是幂函数,后面判断一次±号然后继续2的步骤
/*
以下对正则进行解释:
[\\+\\-]? -> 正或负符号出现与否
\\d* -> 整数部分是否出现,如-.34 或 +3.34均符合
(\\.\\d+)? -> 如果出现小数点,那么小数点后面必须有数字; 否则一起不出现
([eE][\\+\\-]?\\d+)? -> 如果存在指数部分,那么e或E肯定出现,+或-可以不出现, 紧接着必须跟着整数;或者整个部分都不出现
*/
public class Solution {
public boolean isNumeric(char[] str) {
String string = String.valueOf(str);
return string.matches("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");
}
}
正常解法
思路:
- 利用下标,对字符串长度进行位移判断
- 判断第一位会不会出现符号位,不会判断整数位,整数位判断完,检查有.还是有e,.后面跟着整数位,e后面跟着符号位再是整数位
public class Solution {
private int index = 0;
public boolean isNumeric(char[] str) {
if (str.length < 1)
return false;
boolean flag = scanInteger(str); //扫描第一个符号,然后去判断整数位,如果有整数返回true
if (index < str.length && str[index] == '.') { //整数位判断完,如果没有整数位会返回false,有整数位就会接着判断小数位
index++;
flag = scanUnsignedInteger(str) || flag;
}
if (index < str.length && (str[index] == 'E' || str[index] == 'e')) { //幂函数紧接着要判断符号
index++;
flag = flag && scanInteger(str);
}
return flag && index == str.length;
}
//判断符号位
private boolean scanInteger(char[] str) {
if (index < str.length && (str[index] == '+' || str[index] == '-') )
index++;
return scanUnsignedInteger(str);
}
//判断是否存在整数
private boolean scanUnsignedInteger(char[] str) {
int start = index;
while (index < str.length && str[index] >= '0' && str[index] <= '9')
index++;
return start < index; //是否存在整数
}
}