题目描述
- 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串+100, 5e2, -123, 3.1416及-1E-16都表示数值,但12e, 1a3.14, 1.2.3, +-5及12e+5.4都不是。
算法分析
- 表示数值的字符串遵循模式:A[.[B]][e|EC]或者.B[e|EC],其中A为整数部分,B为小数部分,C为指数部分;其中A,C均有+,-符号存在,但B无符号存在;
- A,B存在不同时出现的情况,如.123及123.均为数字正确表示。
- 当e或E前面没有数字(如e1)或后面没有整数(+12e5.4)时,整个字符串不能表示数字。
提交代码:
class Solution {
public:
bool isNumeric(char* string)
{
if (!string)
return false;
bool numeric = scanInteger(&string);
// 小数部分判断
if (*string == '.')
{
++string;
// 下面一行代码用||的原因:
// 1. 小数可以没有整数部分,例如.123等于0.123;
// 2. 小数点后面可以没有数字,例如233.等于233.0;
// 3. 当然小数点前面和后面可以有数字,例如233.666
numeric = scanUnsignedInteger(&string) || numeric;
}
// 判断科学表达部分
if (*string == 'E' || *string == 'e')
{
++string;
// 下面一行代码用&&的原因:
// 1. 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
// 2. 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4
numeric = numeric && scanInteger(&string);
}
return numeric && (*string == '\0');
}
/* 扫描数字部分 */
bool scanUnsignedInteger(char **str)
{
char *start = *str;
while (**str != '\0' && **str >= '0' && **str <= '9')
++(*str);
return (*str) > start;
}
/* 扫描有符号数字部分 */
bool scanInteger(char **str)
{
if (**str == '+' || **str == '-')
++(*str);
return scanUnsignedInteger(str);
}
};
测试代码:
// ====================测试代码====================
void Test(char* testName, char* str, bool expected)
{
if (testName != nullptr)
printf("%s begins: ", testName);
Solution s;
if (s.isNumeric(str) == expected)
printf("Passed.\n");
else
printf("FAILED.\n");
}
int main(int argc, char* argv[])
{
Test("Test1", "100", true);
Test("Test2", "123.45e+6", true);
Test("Test3", "+500", true);
Test("Test4", "5e2", true);
Test("Test5", "3.1416", true);
Test("Test6", "600.", true);
Test("Test7", "-.123", true);
Test("Test8", "-1E-16", true);
Test("Test9", "1.79769313486232E+308", true);
printf("\n\n");
Test("Test10", "12e", false);
Test("Test11", "1a3.14", false);
Test("Test12", "1+23", false);
Test("Test13", "1.2.3", false);
Test("Test14", "+-5", false);
Test("Test15", "12e+5.4", false);
Test("Test16", ".", false);
Test("Test17", ".e1", false);
Test("Test18", "e1", false);
Test("Test19", "+.", false);
Test("Test20", "", false);
Test("Test21", nullptr, false);
return 0;
}