給定一個字符串,判斷其是否能表示一個合法的數字。合法數字包括整數、小數、科學計數法表示等形式,並允許前後空格、正負號。
"0" → true" 0.1 " → true"abc" → false"1 a" → false"2e10" → true主要難點在於覆蓋所有邊界情況。允許的情況包括:
"1."、".34"、"+.1")採用狀態機或逐字符掃描配合標記變量:
class Solution {
public:
bool isNumber(const char *s) {
if (!s) return false;
int i = 0, n = strlen(s);
// 跳過前導空格
while (i < n && s[i] == ' ') ++i;
// 跳過尾隨空格
while (n > i && s[n-1] == ' ') --n;
if (i >= n) return false;
bool numSeen = false, dotSeen = false, eSeen = false;
for (int j = i; j < n; ++j) {
char c = s[j];
if (c >= '0' && c <= '9') {
numSeen = true;
} else if (c == '.') {
if (dotSeen || eSeen) return false;
dotSeen = true;
} else if (c == 'e' || c == 'E') {
if (eSeen || !numSeen) return false;
eSeen = true;
numSeen = false; // 指數部分需重新檢測數字
} else if (c == '+' || c == '-') {
if (j != i && s[j-1] != 'e' && s[j-1] != 'E') return false;
} else {
return false;
}
}
return numSeen;
}
};