题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。题目地址
解题思路
这道题无非就是找到合法数字的规则
比如
- 不能出现两个E
- 不能出现除数组,运算符号,E之外的其他字符
- 不能出现两个小数点
- E后面的必须是整数,不能出现小数点
- +-符号不能相邻
- 符号位只能出现在第一位或者E的后一位
我们只要设计几个标记位,记录是否出现小数点,E等,再配合上面的规则。就可以完成解题
代码
public class Solution {
//是否出现了 -/+/点/E
boolean isF,isZ,isD,isE;
//E,-,+ 的位置
int eIn,fIn,zIn;
public boolean isNumeric(char[] str) {
int index=0;
while(index < str.length){
char d = str[index];
//判断是否出现其他数字
if(!Character.isDigit(d)){
switch(d){
case 'e':
case 'E':
if(index == str.length-1 || isE){
//不能同时出现两个E 并且 不能是最后一位
return false;
}
isE = true;
eIn = index;
break;
case '.':
if(isD || isE){
//出现了小数点 和 E 都不可以
return false;
}
isD = true;
break;
case '+':
if(index != 0 && !isE){
//符号位只能出现在第一位或者E的后一位
return false;
}
if(isF||isZ){
//不能同时出现两个+ -
return false;
}
isZ=true;
zIn = index;
break;
case '-':
if(isZ){
return false;
}
if(isF){
if(fIn>=eIn){
return false;
}
}
isF = true;
fIn = index;
break;
default:
return false;
}
}
index++;
}
return true;
}
}
网友评论