剑指offer之【表示数值的字符串】
题目:
表示数值的字符串
链接:
https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2?tpId=13&tqId=11206&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:
表示数值的字符创应该符合以下模式:
【正负号】数字【.【分数数字】】【e|E【指数正负号】指数数字】 。
其中【表示这里的内容可有可无】
代码:
1 /************************************************************************* 2 > File Name: jz54.cpp 3 > Author: wangshujing 4 > Mail: wangshujingu@163.com 5 > Created Time: Fri 09 Jun 2017 10:47:19 AM CST 6 ************************************************************************/ 7 8 // 剑指offer 第 54 题:表示数值的字符串 9 10 #include<iostream> 11 using namespace std; 12 class Solution{ 13 public: 14 bool isNumeric(char* string){ 15 if(string == nullptr){ 16 return false; 17 } 18 if(*string == '+' || *string == '-') 19 ++string; 20 if(*string == '\0'){ 21 return false; 22 } 23 24 bool numeric = true; 25 26 scanDigits(&string); 27 if (*string != '\0'){ 28 // for floats; 29 if(*string == '.'){ 30 ++string; 31 scanDigits(&string); 32 if(*string == 'e' || *string == 'E') 33 numeric = isExponential(&string); 34 } 35 // for integers; 36 else if(*string =='e' || *string == 'E') 37 numeric = isExponential(&string); 38 else 39 numeric = false; 40 } 41 return numeric && *string == '\0'; 42 } 43 void scanDigits(char** string){ 44 while(**string != '\0' && **string >= '0' && **string <= '9') 45 ++(*string); 46 } 47 bool isExponential(char** string){ 48 if(**string != 'e' && **string != 'E') 49 return false; 50 ++(*string); 51 if(**string == '+' || **string == '-'){ 52 ++(*string); 53 } 54 if(**string == '\0') 55 return false; 56 scanDigits(string); 57 return (**string == '\0')? true:false; 58 } 59 }; 60 61 int main(){ 62 char num[] = "1.2.3"; 63 Solution a; 64 bool out = a.isNumeric(num); 65 if(out) 66 cout<<"是数字!"<<endl; 67 else 68 cout<<"不是数字!"<<endl; 69 return 0; 70 }