劍指offer 52:表示數值的字符串

題目描述

請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示數值。
但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

正則解法

思路:

  1. 正則表達式的解法,熟悉正則表達式的可以利用正則表達式解法
  2. 先判斷是否有加減號一開始,然後後面跟着是不是數字,是就爲true,不是false,
  3. 如果跟着e則說明是冪函數,後面判斷一次±號然後繼續2的步驟
/*
以下對正則進行解釋:
[\\+\\-]?            -> 正或負符號出現與否
\\d*                 -> 整數部分是否出現,如-.34 或 +3.34均符合
(\\.\\d+)?           -> 如果出現小數點,那麼小數點後面必須有數字; 否則一起不出現
([eE][\\+\\-]?\\d+)? -> 如果存在指數部分,那麼e或E肯定出現,+或-可以不出現,  緊接着必須跟着整數;或者整個部分都不出現
*/
public class Solution {
    public boolean isNumeric(char[] str) {
        String string = String.valueOf(str);
        return string.matches("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");
    }
}

正常解法

思路:

  1. 利用下標,對字符串長度進行位移判斷
  2. 判斷第一位會不會出現符號位,不會判斷整數位,整數位判斷完,檢查有.還是有e,.後面跟着整數位,e後面跟着符號位再是整數位
public class Solution {
    private int index = 0;
  
    public boolean isNumeric(char[] str) {
        if (str.length < 1)
            return false;
         
        boolean flag = scanInteger(str);   //掃描第一個符號,然後去判斷整數位,如果有整數返回true
         
        if (index < str.length && str[index] == '.') {  //整數位判斷完,如果沒有整數位會返回false,有整數位就會接着判斷小數位
            index++;
            flag = scanUnsignedInteger(str) || flag;
        }
         
        if (index < str.length && (str[index] == 'E' || str[index] == 'e')) {   //冪函數緊接着要判斷符號
            index++;
            flag = flag && scanInteger(str);
        }
         
        return flag && index == str.length;
         
    }
     
    //判斷符號位
    private boolean scanInteger(char[] str) {
        if (index < str.length && (str[index] == '+' || str[index] == '-') )
            index++;
        return scanUnsignedInteger(str);
         
    }
     
    //判斷是否存在整數
    private boolean scanUnsignedInteger(char[] str) {
        int start = index;
        while (index < str.length && str[index] >= '0' && str[index] <= '9')
            index++;
        return start < index; //是否存在整數
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章