这个题难度并不大,主要考虑几个方面:
1.正负号位,只能出现一次,只能出现在数字的前面
2.小数点位,只能出现一次,必须出现在数字的终点
3.指数为e或E,可以出现在数字之前或者数字之后
4.称为数字的必要条件是必须包含数字(e和E算不算数组根据题目而定,此时假定不算)
1 class Solution { 2 public: 3 bool isNumeric(char* str) 4 { 5 if (str == NULL || str[0] == '\0') 6 return false; 7 int sig = 0;//判断符号位的个数 8 int num = 0;//数字的个数 9 int point = 0;//小数点个数 10 11 //先判断空格,跳过空格 12 while (*str == ' ') 13 str++; 14 15 //判断符号位 16 while (*str == '+' || *str == '-') 17 { 18 sig++; 19 str++; 20 if (sig > 1) 21 { 22 return false; 23 } 24 } 25 //判断数字的个数 26 27 while (*str >= '0' && *str <= '9') 28 { 29 num++; 30 str++; 31 } 32 while (*str == '.')//本来我是这样写的,结果那个奇怪的测试用例无法通过,看下面 33 //while (num&&*str == '.') 34 //小数点前面必须有数字才是数字这不是很简单的道理吗 35 { 36 point++; 37 str++; 38 if (sig > 1) 39 { 40 return false; 41 } 42 } 43 while (*str >= '0' && *str <= '9') 44 { 45 num++; 46 str++; 47 } 48 if (*str == 'e' || *str == 'E') 49 { 50 str++; 51 { 52 sig = 0; 53 while (*str == '+' || *str == '-') 54 { 55 sig++; 56 str++; 57 if (sig > 1) 58 { 59 return false; 60 } 61 } 62 //判断数字的个数 63 num = 0; 64 while (*str >= '0' && *str <= '9') 65 { 66 num++; 67 str++; 68 } 69 if (num == 0)//e的后面必须有数字 70 return false; 71 if (*str == '\0') 72 return true; 73 else 74 { 75 return false; 76 } 77 } 78 } 79 else 80 if (*str == '\0'&&num) //必须有数字才是数字 81 return true; 82 else 83 { 84 return false; 85 } 86 87 } 88 89 };
有一个测试用例是“-.123”,样例输出竟然是true?
这算是数字吗,牛客网到底是怎么想的,小数点的前面没有数字也可以吗?