題目:請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
表示數值的字符串遵循模式A[.[B]][e|EC]或者.B[e|EC]。找到規律是這個題的重點。判斷一個字符串是否表示數值時,可以按照模式對每一爲進行掃描,判斷是否符合要求。上述A和C都是可能以'+'和'-'開頭的0~9的數位串,B是0~9的數位串,但前面不能有正負號。判斷字符串是否符合上述模式時,首先儘可能多的掃描0~9的數位(有可能在起始處有‘+’或者‘-’),也就是前面模式中表示數值整數的A部分。如果遇到小數點’.‘,則開始掃描表示數值小數部分的B部分。如果遇到’e‘或者’E‘,則開始掃描表示數值指數的C部分。
整個代碼的實現過程就是一個排除掉所有不滿足數值條件的過程。1、判斷string是否爲空,如果爲空,則返回false;2、定義三個布爾邏輯符:sign(’+‘或’-‘)、decimal(小數點’.‘)、hasE(指數符號e或E)爲false;3、循環逐個檢測字符串中的數值:(1)指數符號e或E:e的前後必須爲整數,一個數值表示中只能有一個e或E;(2)小數點’.‘:只能出現一次,不能出現在最後一位,只能出現在e的前面;(3)'+'或’-‘號:第一次出現只能在第一個字符或者指數符號後,第二次出現只能在指數符號之後,不能出現在最後一位;(4)整數位:整數字符只能在’0‘~’9‘之間,不能是其他數據字符。不滿足上述條件的返回false,否則返回true。
代碼:
class Solution {
public:
bool isNumeric(char* string)
{
//把所滿足非數值的條件都返回false,剩餘的滿足條件的都是true
if(string == nullptr)
return false;
bool sign = false, decimal =false, hasE = false;
for(int i=0;i < strlen(string); i++){
if(string[i] == 'e' || string[i] == 'E'){
//string[0]=e,即e的前面不爲整數,返回false
if(i == 0) return false;
//string[strlen(string)-1]=e,即e爲字符串最後一個,e的後面不爲整數,返回false
if(i == strlen(string)-1) return false;
//一個數值表示中,只能有一個e
if(hasE) return false;
hasE = true;
}
else if(string[i] == '.'){
//小數點不能出現在e的後面
if(hasE || decimal) return false;
//如果出現在最後一位,返回false
if(i == strlen(string)-1) return false;
decimal = true;
}
else if(string[i] == '+' || string[i] == '-'){
//第一次出現只能在第一個字符或指數符號之後
if(!sign && i != 0 && !hasE) return false;
//第二次出現只能在指數符號之後
if(!hasE && sign) return false;
//’+‘和’-‘不能出現在最後一位,如果出現在最後一位,返回false
if(i == strlen(string)-1) return false;
sign = true;
}
else if(string[i] < '0' || string[i] > '9') return false;
}
return true;
}
};