题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
解题思路
这和前面把字符串转换为整数的方法类似,添加了小数的判断和科学计数的部分判断。
若没有小数,和科学计数,则直接按照字符串转整数的方法判断。
若有'e','E'则后面的可以是 '+', '-'和0~9的整数;
若有'.'则后面可以有'e','E'(它们后面的字符如上所示),和0~9的正整数组成;
但是我认为除了'+', '-'可以在前面,而'.', 'e', 'E'不能在最前面,或者紧跟在'+', '-'后面。不知道这样想对不对,反正这样写的代码没通过牛客网。出现 -.123应输出为true。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
class Solution { public: bool isNumeric (char* string) { if (string == NULL || *string == '\0') return false; if (*string == '+' || *string == '-') string++; bool numeric = true; scanDigits(&string); if (*string != '\0') { if (*string == '.') { string++; scanDigits(&string); if (*string == 'e' || *string == 'E') numeric = isExponential(&string); } else if (*string == 'e' || *string == 'E') { numeric = isExponential(&string); } else numeric = false; } return numeric && *string == '\0'; } private: void scanDigits(char** string) { while (**string != '\0' && **string >= '0' && **string <= '9') (*string)++; } bool isExponential (char** string) { (*string)++; if (**string == '\0') return false; if (**string == '+' || **string == '-') (*string)++; scanDigits(string); return (**string == '\0') ? true : false; } };
|
参考博文链接:https://cuijiahua.com/blog/2018/01/basis_53.html