每日一道编程题之表示数值的字符串
题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
输入:
+100
-100.
.123
5.3e+3
4e-5
4.3e3.5
3E-1.2
3a78
输出:
true
true
true
true
true
false
false
false
解题思路:
对输入串进行以下筛选,符合以下条件的输入串就符合要求:
1、第一位字符只能是 + - . 0-9
2、输入串中小数点最多只能出现一次且只能出现在e之前
3、e后面的符号串只能是正负号和数值字符
4、输入串的符号只能是 + - . 0-9 e E
循环遍历输入串,当不符合以上任意一个条件时,就返回false即可,当遍历完输入串都没有返回false的话,就说明输入串表示的是数值,返回true。
Java实现:
public class Solution {
public boolean isNumeric(char[] str) {
// 判断条件1
if(str[0]=='+' || str[0]=='-' || (str[0]>='0'&&str[0]<='9') ||str[0]=='.'){
int i=1;
boolean f1 = false; // 标记小数点出现的次数
boolean f2 = false; // 标记小数点出现在e之前还是e之后
while(i<str.length){
if(str[i] == '.'){ // 判断条件2
if(!f1 && !f2) // 若小数点首次出现且出现在e之前,说明符合要求,其余的都是不符合要求
f1 = true;
else
return false;
}else if(str[i] == 'e' || str[i] == 'E'){ // 判断条件3
f2 = true;
if(i==str.length-1)
return false;
if(!((str[i+1]>='0'&& str[i+1]<='9') || str[i+1]=='-' || str[i+1]=='+')) //
return false;
i++;
}else if(str[i]<'0' || str[i]>'9') // 经过上面的筛选,该位上的数只能是数字字符
return false;
i++;
}
return true;
}
return false;
}
}
另一只解法:
用Java中Double的方法和异常结合使用
链接:https://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2
来源:牛客网
public class Solution {
public boolean isNumeric(char[] str) {
try {
double re = Double.parseDouble(new String(str));
} catch (NumberFormatException e) {
return false;
}
return true;
}
}