您的位置:首页 > Web前端

剑指Offer-20:表示数值的字符串

2018-01-05 12:00 459 查看

题目:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

例子

例如,字符串”+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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息