劍指Offer_#20_表示數值的字串
阿新 • • 發佈:2020-06-27
劍指Offer_#20_表示數值的字串
劍指offerContents
題目
請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100"、"5e2"、"-123"、"3.1416"、"0123"都表示數值,但"12e"、"1a3.14"、"1.2.3"、"+-5"、"-1E-16"及"12e+5.4"都不是。
思路分析
數字字串遵循的模式為A[.[B]][e|EC]
或者.B[e|EC]
。
數字字串當中有兩個分界點,
- 小數點
.
- 指數符號
e
或E
兩個分界點,分出了三段數字部分,
A
是小數點之前的整數部分,可以帶有正負號B
是小數點之後,指數符號之前的小數部分,不可帶有正負號C
是指數符號之後的整數部分,可以帶有正負號
注意這其中需要特殊考慮的字元就是正負號。
演算法思路
首先設定幾個boolean
變數作為flag,用來記錄之前是否已經遇到過字元'0'-'9'
,字元.
,字元e
或E
從前往後遍歷字串,根據當前遇到的字元以及記錄下來的flag,判斷是否是合法的數字字串。
解答
class Solution {
public boolean isNumber(String s) {
if(s == null || s.length() == 0) return false;
boolean numSeen = false;
boolean dotSeen = false;
boolean eSeen = false;
char[] str = s.trim().toCharArray();
for(int i = 0;i < str.length;i++){
if(str[i] >= '0' && str[i] <= '9'){
//出現數字'0'~'9',則標記numSeen為true
numSeen = true ;
}else if(str[i] == '.'){
//.之前不能出現 . 或者 e
if(dotSeen || eSeen) return false;
dotSeen = true;
}else if(str[i] == 'e' || str[i] == 'E'){
//e之前不能出現e,且必須出現數字
if(eSeen || !numSeen) return false;
eSeen = true;
//e之後,必須有整數,所以需要把numSeen重置為false
numSeen = false;
}else if(str[i] == '-' || str[i] == '+'){
//正負號只能出現在0位置或者e後面的第一個位置
if(i != 0 && str[i - 1] != 'e' && str[i - 1] != 'E') return false;
}else{
//出現其他字元都是不合法的
return false;
}
}
//迴圈到最後一個字元,如果是遇到非法情況,迴圈未結束就直接返回false了
//如果迴圈到最後一個字元,還沒有返回false,就判斷numSeen是否為true即可
return numSeen;
}
}
複雜度分析
時間複雜度:O(n)
,n
為字串的長度。