本文首發于我的個人部落格: 尾尾部落
題目描述
請實作一個函數用來判斷字元串是否表示數值(包括整數和小數)。例如,字元串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
解題思路
設定三個标志符分别記錄“+/-”、“e/E”和“.”是否出現過。
- 對于“+/-”: 正常來看它們第一次出現的話應該出現在字元串的第一個位置,如果它第一次出現在不是字元串首位,而且它的前面也不是“e/E”,那就不符合規則;如果是第二次出現,那麼它就應該出現在“e/E”的後面,如果“+/-”的前面不是“e/E”,那也不符合規則。
- 對于“e/E”: 如果它的後面不接任何數字,就不符合規則;如果出現多個“e/E”也不符合規則。
-
對于“.”: 出現多個“.”是不符合規則的。還有“e/E”的字元串出現“.”也是不符合規則的。
同時,要保證其他字元均為 0-9 之間的數字。
參考代碼
public class Solution {
public boolean isNumeric(char[] str) {
int len = str.length;
boolean sign = false, decimal = false, hasE = false;
for(int i = 0; i < len; i++){
if(str[i] == '+' || str[i] == '-'){
if(!sign && i > 0 && str[i-1] != 'e' && str[i-1] != 'E')
return false;
if(sign && str[i-1] != 'e' && str[i-1] != 'E')
return false;
sign = true;
}else if(str[i] == 'e' || str[i] == 'E'){
if(i == len - 1)
return false;
if(hasE)
return false;
hasE = true;
}else if(str[i] == '.'){
if(hasE || decimal)
return false;
decimal = true;
}else if(str[i] < '0' || str[i] > '9')
return false;
}
return true;
}
}