天天看點

[劍指offer] 表示數值的字元串

本文首發于我的個人部落格: 尾尾部落

題目描述

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

解題思路

設定三個标志符分别記錄“+/-”、“e/E”和“.”是否出現過。

  • 對于“+/-”: 正常來看它們第一次出現的話應該出現在字元串的第一個位置,如果它第一次出現在不是字元串首位,而且它的前面也不是“e/E”,那就不符合規則;如果是第二次出現,那麼它就應該出現在“e/E”的後面,如果“+/-”的前面不是“e/E”,那也不符合規則。
  • 對于“e/E”: 如果它的後面不接任何數字,就不符合規則;如果出現多個“e/E”也不符合規則。
  • 對于“.”: 出現多個“.”是不符合規則的。還有“e/E”的字元串出現“.”也是不符合規則的。

    同時,要保證其他字元均為 0-9 之間的數字。

參考代碼

public class Solution {
    public boolean isNumeric(char[] str) {
        int len = str.length;
        boolean sign = false, decimal = false, hasE = false;
        for(int i = 0; i < len; i++){
            if(str[i] == '+' || str[i] == '-'){
                if(!sign && i > 0 && str[i-1] != 'e' && str[i-1] != 'E')
                    return false;
                if(sign && str[i-1] != 'e' && str[i-1] != 'E')
                    return false;
                sign = true;
            }else if(str[i] == 'e' || str[i] == 'E'){
                if(i == len - 1)
                    return false;
                if(hasE)
                    return false;
                hasE = true;
            }else if(str[i] == '.'){
                if(hasE || decimal)
                    return false;
                decimal = true;
            }else if(str[i] < '0' || str[i] > '9')
                return false;
        }
        return true;
    }
}
           

繼續閱讀