【劍指offer中等部分21】表示數值的字串(java)
阿新 • • 發佈:2020-12-22
題目描述
請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示數值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
分析
判斷每個字串有下面幾個步驟:
1、判斷首位是否為符號位
2、非首位數字是不是0-9,而非其他字元
3、若遇到小數點和e,則判斷其後面字元是否符合數值表示式的要求
實現程式碼如下:
public class Solution {
public boolean isNumeric(char[] str) {
if(str==null || str.length < 1){
return false;
}
int len = str.length; //每個字元的長度
for(int i = 0 ; i < len ; i++){
if(str[i] == '+' || str[i] == '-'){
if (i != 0){
return false;
}else continue;
}
if (str[i] == '.'){
return afterPoint(i+1,len,str);// afterPoint用於判斷小數點後的字元是否符合
}
if(str[i] == 'e' || str[i] == 'E'){
return afterE(i+1,len,str); // afterPoint用於判斷e後字元是否符合
}
if( str[i] < '0' || str[i] > '9'){
return false; //非首位若出現ASCI小於'0'或者大於'9'的字元,即要是0-9之間,不滿足返回false
}
}
return true;
}
//小數點後只能是數字或者科學表示式的組合 如 3.2e-10;a為小數點後一位
public boolean afterPoint(int a,int len,char[] str){
//小數點後無數字,或者不在0-9之內均返回false
if(len-a == 0 || str[a] < '0' || str[a] > '9'){
return false;
}
//小數點後第二位可以是數字也可以是科學計數法
for(int i = a+1 ; i < len ; i++){
//非數字或e均報錯
if(str[i] == 'e' || str[i] == 'E'){
return afterE(i+1,len,str);
}
if(str[i] < '0' || str[i] > '9'){
return false;
}
}
return true;
}
//判斷首次出現e之後的情況,a為e後一位
public boolean afterE(int a,int len,char[] str){
//e處於最後一位時報錯
if(len-a == 0){
return false;
}
for(int i = a; i < len ; i++){
//正負號只能出現在e之後第一位
if(str[i] == '+' || str[i] == '-'){
if(i != a){
return false;
}else continue;
}
if(str[i] < '0' || str[i] > '9'){
return false;
}
}
return true;
}
}