题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、“1a3.14”、“1.2.3”、“±5”及“12e+5.4”都不是。
补充知识点:
e/E科学计数法:这是一种记数的方法。把一个数表示成a(1≤a<10,n为整数)与10的n次幂相乘的形式 。
例如:19971400000000=1.99714×10^13。计算器或电脑表达10的幂是一般是用E或e,也就是1.99714E13。
相关公式:
aEb=a×10^b
aE+b=a×10^b
aE-b=a×10^(-b)
解题思路
- 表示数值的字符串遵循模式:A[.[B]][e|EC]或者.B[e|EC]。
- A为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着‘e’或者‘E’为数值的指数部分。
- 指数符号‘e’或‘E’前后必须有数字,指数符号只能出现一次。
- 小数点只能出现在指数符号之前;只能出现一次;不能出现在最后一位上。
- 正负号‘+’,‘-’第一次只能出现在第一个字符或者指数符号后;第二次只能出现在指数符号后;不能出现在最后一位。
2.代码:
class Solution{
public:
bool isNumeric(char* str){
if(str == NULL) return false;
//标记 '+'-'符号,小数点,指数符号e/E是否出现过
bool sign = false, decimal = false, hasE = false;
for(int i = 0; i < strlen(str); i++){
//遇到'e'或者'E'
if(str[i] == 'e' || str[i] == 'E'){
//指数符号前必须有整数
if(i == 0) return false;
//指数符号后必须有整数
if(i == strlen(str)-1) return false;
//只能有一个指数符号
if(hasE) return false;
hasE = true;
}
//遇到'.'
else if(str[i] == '.'){
//小数点只能出现在指数符号之前
if(hasE) return false;
// 小数点只能出现一次
if(decimal) return false;
// 小数点不能出现在最后一位上
if(i == strlen(str) - 1) return false;
decimal = true;
}
//遇到'+'或者'-'
else if(str[i] == '-' || str[i] == '+'){
//第一次出现+''-'符号只能在第一个字符或者指数符号后
if(!sign && i != 0 && !hasE) return false;
//第二出现'+''-'符号只能在指数符号后
if(sign && !hasE) return false;
//'+''-'符号不能出现在最后一位上
if(i == strlen(str) - 1) return false;
sign = true;
}
//遇到不法字符
else if(str[i] < '0' || str[i] > '9') return false;
}
return true;
}
};