题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
解法一:
通过观察我们发现,字符串为数值需满足以下几个条件:
1、可以包含E或e,也可以不包含E或e
2、若包含E或e,则只能出现一次,且不在字符串末尾
3、E或e前面的部分可以是整数也可以是小数,之后的部分只能是整数。
由此我们只需要判断字符串是否包含E或e,且前半部分是否是整数或小数,后半部分是否是小数即可。
public class Solution {
public boolean isNumeric(char[] str) {
int i = 0;
for(i = 0; i < str.length; i++) {
if(str[i] == 'E' || str[i] == 'e') {
break;
}
}
//E(或e)的位置不能为字符串末尾
if(i == str.length - 1) {
return false;
}
//字符串不含E或e
else if(i == str.length) {
return isNumber(str, 0, str.length - 1);
}
//字符串含E或e,且不在字符串末尾
else {
if(isNumber(str, 0, i - 1) && isNumber(str, i + 1, str.length - 1)) {
if(isInt(str, i + 1, str.length - 1)) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
}
//判断是否是合法数字(整数或小数)
public boolean isNumber(char[] str, int start, int end) {
int pointCount = 0;
for(int i = start; i <= end; i++) { if(str[i] >= '0' && str[i] <= '9') {
continue;
}
if(str[i] == '.') {
if(pointCount == 0) {
pointCount++;
continue;
}
else {
return false;
}
}
else {
//处理+-号问题
boolean isSymbol = (i == start) && (str[i] == '+' || str[i] == '-');
if(isSymbol) {
continue;
}
else {
return false;
}
}
}
return true;
}
//在已知为合法数字的基础上判断是否是整数
public boolean isInt(char[] str, int start, int end) {
for(int i = start; i <= end; i++) {
if(str[i] == '.') {
return false;
}
}
return true;
}
}
解法二:
表示字符的字符串遵循模式:
A[.[B]][e|EC],如100、1.2、1.2e、1.2E+4
或.B[e|EC],如.2、.3e-2
其中A和C表示整数(可以有符号)、B表示无符号整数。
于是对于一个字符串,我们可以先判断其开头是否为A部分,判断之后是否为小数点,若有小数点之后是否为B部分,之后是否为e|E,若为e|E之后是否为C部分。
public class Solution {
public boolean isNumeric(char[] str) {
int index = scanInteger(str, 0);
if((index < str.length) && (str[index] == '.')) {
index = scanUnsignedInteger(str, index + 1);
}
boolean isE = (index < str.length - 1) && (str[index] == 'E' || str[index] == 'e');
if(isE) {
index = scanInteger(str, index + 1);
}
if(index == str.length) {
return true;
}
else {
return false;
}
}
/**判断是否为A或C部分*/
public int scanInteger(char[] str, int start) {
int end = start;
boolean isSymbol = (end < str.length) && (str[end] == '+' || str[end] == '-');
if(isSymbol) {
end++;
}
return scanUnsignedInteger(str, end);
}
/**判断是否为B部分*/
public int scanUnsignedInteger(char[] str, int start) {
int end = start;
while((end < str.length) && (str[end] >= '0' && str[end] <= '9')) {
end++;
}
return end;
}
}
网友评论