题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例子
例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
链接:
剑指Offer(第2版):P127
思路标签:
- 字符串匹配
解答:
1. C++
- 主要考察对问题分析的全面性;
- 表示数值的字符串遵循模式:A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是整数(可以有正负号,也可以没有),而B是一个无符号整数。
- 判断小数和整数部分用‘||’来判断:如:.123、233.、233.123这三个均为数值;(这里需要注意的是,使用‘||’要将
scanUnsignedInteger()
放在前面,因为如果numeric放在前面,numeric为真,scanUnsignedInteger()
函数便不再执行,导致出错) - 判断小数和指数部分用‘&&’,因为e或者E前面都需要有数字。
- 最后用字符串为空和前面的数字部分的‘&&’ 来防止指数出现小数或其他的情况。
class Solution {
public:
bool isNumeric(char* string)
{
if (string == nullptr)
return false;
bool numeric = scanInteger(&string);
if (*string == '.') {
++string;
numeric = scanUnsignedInteger(&string) || numeric;
}
if (*string == 'e' || *string == 'E') {
++string;
numeric = numeric && scanInteger(&string);
}
return numeric && *string == '\0';
}
bool scanInteger(char** string) {
if (**string == '+' || **string == '-')
++(*string);
return scanUnsignedInteger(string);
}
bool scanUnsignedInteger(char** string) {
char* before = *string;
while (**string != '\0' && **string >= '0' && **string <= '9')
++(*string);
return *string > before;
}
};
- 因为在判断的过程中,涉及到了指针的变换,所以在函数传递的中需要使用指针的引用:&string,且子函数的参数为指针的指针:char** string。