题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:
表示数值的字符串遵循如下模式:
[sign]integral-digits[.[fractional-digit]][e|E[sign]exponential-digits]
说明一下:在数值之前可能有正负符号'+',‘-’,接下来是若干0-9的数位表示数值的整数部分(在某些小数里可能没有整数部分)。如果数值是一个小数,那么在小数点后面可能会有若干0到9的数位表示数值的小数部分,如果数值用科学计数法表示,接下来是一个‘e’或‘E’,以及紧跟着一个整数(可以有正负号)表示指数。
判断一个字符串是否满足上述模式,首先看第一个字符是否为正负符号,如果是在字符串往前移动一个字符,继续扫描字符串剩下中0-9的位数,如果是一个小数,则将遇到小数点,如果是科学计数法,在整数或者小数后面可能会遇到‘e’或‘E’.
代码:
#include <iostream>
#include <string.h>using namespace std;void scanDigits(char** string){while(**string!='\0' && **string>='0' && **string<='9')++(*string);
}bool isExponential(char** string){if(**string!='e' && **string!='E')return false;++(*string);if(**string=='+' || **string=='-')++(*string);if(**string=='\0')return false;scanDigits(string);return (**string=='\0')?true:false;
}bool isNumeric(char* string){if(string==NULL)return false;if(*string=='+' || *string=='-')++string;if(*string=='\0')return false;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);elsenumeric=false;}return numeric && *string=='\0';
}int main()
{cout << isNumeric("5e2") << endl;cout << isNumeric("12e") << endl;cout << isNumeric("1a3.14") << endl;cout << isNumeric("+-5") << endl;return 0;
}
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/6f8c901d091949a5837e24bb82a731f2?rp=3
AC代码:
class Solution {
public:bool isNumeric(char* string){if(string==NULL)return false;int len=strlen(string);int index=0;if(string[index]=='+' || string[index]=='-')++index;if(index>=len)return false;bool numeric=true;scanDigit(string,index);if(index<len){if(string[index]=='.'){++index;scanDigit(string,index);if(index>=len)numeric=true;else if(string[index]=='e' || string[index]=='E')numeric=isExponential(string,index);elsenumeric=false;}else if(string[index]=='e' || string[index]=='E')numeric=isExponential(string,index);elsenumeric=false;}return numeric; }void scanDigit(char* string,int& index){while(string[index]!='\0' && string[index]>='0' && string[index]<='9')++index;}bool isExponential(char* string,int index){if(string[index]!='e' && string[index]!='E')return false;++index;if(string[index]=='+' || string[index]=='-')++index;if(string[index]=='\0')return false;scanDigit(string,index);return (string[index]=='\0')?true:false;}};