本文为剑指 offer 系列第五十篇。
主要知识点为字符串,重点在于细心,认真的去判断成为数值的条件,然后再去做题就比较快。
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,“-123”,“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
解题思路
这个题目主要要考虑以下的问题
- 小数点,正负号,指数标志可能会出现多次的问题。解决方式是设置一个标志,用来记录它们之前是否已经出现。
- 直接以小数点或者指数标志或者正负号结尾:解决方式在每个条件结束的时候进行一次是否到结尾的判断
- string以‘\0’为标志结束。可以用来结束循环。
- 非法字符的问题。 对于前面没有处理的其他的非法情况都直接返回false
解题代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| class Solution { public: bool isNumeric(char* string) { if(string == NULL){ return false; } // 应对仅仅只有+或者-的情况 if(*string == '+' || *string == '-'){ string++; } if(*string == '\0'){ return false; } //标记小数点、整数部分、指数部分是否存在, bool point = false, numint = false, nume = false; while(*string != '\0'){ //处理小数 if(*string == '.'){ if( point || nume) { return false; } string++; point = true; if(*string == '\0'){ return false; } } //处理科学计数法 else if(*string == 'E' || *string == 'e'){ if(numint == false || nume){ return false; } string++; nume = true; if(*string == '+' || *string == '-'){ string++; } if(*string == '\0'){ return false; } } //处理正常数据 else if(*string >= '0' && *string <= '9'){ numint = true; string++; }else{ return false; } } return true; } };
|
时间复杂度为O(n),空间复杂度为O(1)
以上,本题结束!