題目描述
請實現(xiàn)一個函數(shù)用來判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數(shù)值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
解法一:
通過觀察我們發(fā)現(xiàn),字符串為數(shù)值需滿足以下幾個條件:
1、可以包含E或e,也可以不包含E或e
2、若包含E或e,則只能出現(xiàn)一次,且不在字符串末尾
3、E或e前面的部分可以是整數(shù)也可以是小數(shù),之后的部分只能是整數(shù)。
由此我們只需要判斷字符串是否包含E或e,且前半部分是否是整數(shù)或小數(shù),后半部分是否是小數(shù)即可。
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;
}
}
}
//判斷是否是合法數(shù)字(整數(shù)或小數(shù))
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;
}
//在已知為合法數(shù)字的基礎上判斷是否是整數(shù)
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表示整數(shù)(可以有符號)、B表示無符號整數(shù)。
于是對于一個字符串,我們可以先判斷其開頭是否為A部分,判斷之后是否為小數(shù)點,若有小數(shù)點之后是否為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;
}
}