[LeetCode] 65、有效數字

題目描述

驗證給定的字符串是否可以解釋爲十進制數字。

"1 a"` => `false`
`"2e10"` => `true`
`" -90e3  "` => `true

解題思路

《劍指offer》第20題。注意:

  • 小數點前面可以沒有數字、小數點後面可以沒有數字、小數點前面和後面可以都有數字。 => ||
  • eeEE前面沒有數字時,整個字符串不能表示數字。當eeEE後面沒有整數時,整個字符串不能表示數字。 => &&

參考代碼

class Solution {
public:
    bool isNumber(string str){
        int low = 0, high = str.size() - 1;
        while(low <= high && str[low] == ' ') low++;
        while(low <= high && str[high] == ' ') high--;
        if(high < low) 
            return false;
        
        str = str.substr(low, high - low + 1);  // 取出字符串前後部分的空格
        length = str.size(); 
        if(length == 0)
            return false;
        
        int indexOfStr = 0;
        bool res = isInteger(str, indexOfStr);
        if(indexOfStr < length && str[indexOfStr] == '.'){
            indexOfStr++;
            res = isUnsignedInteger(str, indexOfStr) || res;  // 順序一定不能錯,注意邏輯運算的截斷效應
//            res = res || isUnsignedInteger(str, indexOfStr);  // 會出錯!
        }
        
        if(indexOfStr < length && (str[indexOfStr] == 'e' || str[indexOfStr] == 'E')){
            indexOfStr++;
            res = res && isInteger(str, indexOfStr); 
        }
        
        return res && indexOfStr == length;
    }

    bool isInteger(string str, int &indexOfStr){
        if(indexOfStr < length && (str[indexOfStr] == '+' || str[indexOfStr] == '-'))
            indexOfStr++;
        
        return isUnsignedInteger(str, indexOfStr);
    }
    
    bool isUnsignedInteger(string str, int &indexOfStr){
        if(indexOfStr >= length || str[indexOfStr] < '0' || str[indexOfStr] > '9')
            return false;
        while(indexOfStr < length && str[indexOfStr] >= '0' && str[indexOfStr] <= '9')
            indexOfStr++;
        
        return true;
    }

private:
    int length;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章