20 表示数值的字符串
题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
C 语言题解
表示数值的字符串遵循如下模式:
[sign]integral-digits[.[fractional-digits]][e|E[sign]exponential-digits]
判断一个字符串是否符合上述模式时:
- 首先看第一个字符是不是正负号。如果是,在字符串上移动一个字符,继续扫描剩余的字符串中0到9的数位。
- 如果是一个小数,则将遇到小数点。
- 另外,如果是用科学记数法表示的数值,在整数或者小数的后面还有可能遇到'e'或者'E'。
class Solution {
public:
bool isNumeric(char* string)
{
// 异常输入检查
if(string == NULL)
return false;
// 首先假定数字存在整数部分(可能带符号也可能不带符号)
bool numeric = scanInteger(&string);
// 假设存在小数点
if(*string == '.')
{
// 越过小数点
++string;
// 这里需要特别注意,先写scanUnsignedInteger(&string)如果写成
// numeric = numeric || scanUnsignedInteger(&string);
// 由于|| 的短路特性可能会导致错误
// 小数点后面必须是无符号数,因为可能出现小数点前面无整型数的情况,所以此处是||
numeric = scanUnsignedInteger(&string) || numeric;
}
// 假设存在指数形式
if(*string == 'e' || *string == 'E')
{
// 越过指数标志
++string;
// 指数后面必须跟着整数(可能带符号也可能不带符号)
// e或者E前面必须有数字,不管是整数还是小数,所以此处用的是&&
numeric = scanInteger(&string) && numeric;
}
// 最后比达到字符串的末尾
return numeric && *string == '\0';
}
bool scanInteger(char **str)
{
// 此处采用指针的指针是为了参数修改在主调函数中同步
if(**str == '+' || **str == '-')
++(*str);
return scanUnsignedInteger(str);
}
bool scanUnsignedInteger(char **str)
{
char * before = *str;
while(**str != '\0' && **str >= '0' && **str <= '9')
++(*str);
// 此处是保证有无符号整数的存在
return *str > before;
}
};
注意:
- 上述的检查整数->小数->科学计数法的顺序是固定的,不可以调整顺序。
- 使用
||
和&&
时注意短路特性的影响。
C++ 题解
python 题解
直接强制转换成float类型,查看是否能够正确转换。
# -*- coding:utf-8 -*-
class Solution:
# s字符串
def isNumeric(self, s):
# write code here
try:
return float(s)
except:
return 0