劍指offer18

題目描述

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

解題思路分析

其實這道看着麻煩,其實不麻煩,我只要認真分析了,就必定能夠解出來,咱們要對於每次可能碰到字符按狀況分析就能夠函數

  • 當出現的字符是E或e時,這個時候咱們須要直到,若是前面已經出現了E或e的話,那確定就不是數值了,還有就是當e或E出如今最後一個位置時也不是數值
  • 當出現的是+或-時,若是已經出現過+或-且前面一位也不是E或e的話,那確定不是數值,若是沒有出現過+或-且目前出現位置不在第一個且前面一位也不是E或e的話,那也不是數值
  • 當出現的是.的話,若是已經出現了.或者已經出現了E或e的話,那確定不是數值
  • 當出現非0-9的其餘字符時,也不是數值
    有上面四步的分析就很好寫代碼了

代碼實現

public isNumeric(char[] str){
    if (str == null || str.length <= 0) {
        return false;
    }
    boolean hasE = false, demical = fasle, sign =false;
    int length = str.length;
    for (int i = 0; i < length; i++) {
        //出現E或e
        if (str[i] == 'E' || str[i] == 'e') {
            //已經出現過了,那就返回false
            if (hasE) {
                return false;
            }
            //或者在最後一個位置出現
            if (i == length - 1) {
                return false;
            }
            hasE = true;
        } else if (str[i] == '+' || str[i] == '-') {
            //已經出現過了+或-且前面一位不是E或e
            if (sign && (str[i - 1] != 'E' && str[i - 1] != 'e')) {
                return false;
            }
            //沒有出現過+或-可是不是在第一位出現且前面一位不是E或e
            if (!sign && i > 0 && (str[i - 1] != 'E' && str[i - 1] != 'e')) {
                return false;
            }
            sign = true;
        } else if (str[i] == '.') {
            //若是出現過.或者出現了E或e
            if (hasE || demical) {
                return false;
            }
            demical = true;
        } else if (str[i] < '0' || str[i] > '9') {
            //出現其餘字符
            return false;
        }
    }
    return true;
}
複製代碼
相關文章
相關標籤/搜索