題目描述
驗證給定的字符串是否可以解釋爲十進制數字。
"1 a"` => `false`
`"2e10"` => `true`
`" -90e3 "` => `true
解題思路
《劍指offer》第20題。注意:
- 小數點前面可以沒有數字、小數點後面可以沒有數字、小數點前面和後面可以都有數字。 =>
||
- 當或前面沒有數字時,整個字符串不能表示數字。當或後面沒有整數時,整個字符串不能表示數字。 =>
&&
參考代碼
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;
};