1. 程式人生 > 實用技巧 >劍指Offer_#20_表示數值的字串

劍指Offer_#20_表示數值的字串

劍指Offer_#20_表示數值的字串

劍指offer

Contents

題目

請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+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]
數字字串當中有兩個分界點,

  • 小數點.
  • 指數符號eE

兩個分界點,分出了三段數字部分,

  • A是小數點之前的整數部分,可以帶有正負號
  • B是小數點之後,指數符號之前的小數部分,不可帶有正負號
  • C是指數符號之後的整數部分,可以帶有正負號

注意這其中需要特殊考慮的字元就是正負號

演算法思路

首先設定幾個boolean變數作為flag,用來記錄之前是否已經遇到過字元'0'-'9',字元.,字元eE
從前往後遍歷字串,根據當前遇到的字元以及記錄下來的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為字串的長度。