版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaohaibo_/article/details/85882379
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。
但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
注意:
- 小数可以没有整数部分,例如.123等于0.123;
- 小数点后面可以没有数字,例如233.等于233.0;
- 小数点前面和后面可以有数字,例如233.666;
- 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
- 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;
样例:
输入: "0"
输出: true
class Solution {
public:
bool isNumber(string s) {
int n = s.length();
if(n == 0) return false;
if(n == 1) return isdigit(s[0]);
unordered_map<char,int> hash;
int digit = 0;
if(s[0] != '+' && s[0] != '-' && !isdigit(s[0]) && s[0] != '.') return false;
if(s[0] == '.') hash['.']++;
for(int i = 1; i < n; i++) {
if(s[i] == 'e' || s[i] == 'E') {
if(!isdigit(s[i-1])) return false;
if(i+1 == n || (!isdigit(s[i+1]) && s[i+1] != '-' && s[i+1] != '+')) return false;
hash['e']++;
hash['E']++;
if(hash[s[i]] > 1) return false;
continue;
}
if(s[i] == '.') {
if(hash['e'] == 1 || hash['E'] == 1) return false;
hash[s[i]]++;
if(hash[s[i]] > 1) return false;
continue;
}
if(s[i] == '-') {
if((s[i-1] != 'e' && s[i-1] != 'E') || i+1 == n || !isdigit(s[i+1])) return false;
continue;
}
if(s[i] == '+') {
if((s[i-1] != 'e' && s[i-1] != 'E') || i+1 == n || !isdigit(s[i+1])) return false;
continue;
}
if(isdigit(s[i])) digit++;
else return false;
}
if(digit > 0) return true;
else return false;
}
};