leetcode-65-Valid Number

来源:互联网 发布:阿凡达妹妹实力知乎 编辑:程序博客网 时间:2024/06/11 18:47
#include <iostream>#include <string>using namespace std;/* 判断合法数字。 有三种合法数字:(正、负) 1. 整数 2. 小数 .5也算合法 小数点的前面不能有小数点和e    3.也算合法。。。 3. 指数 2e+20算不算合法 2e(10+5)应该没有那么复杂  2.5e19也是合法的 e之前可以有小数点,但是不能有e 允许前后有空格。 */class Solution {public:    bool isNumber(string s) {        int len = int(s.length());        int i = 0;        bool isFloat = false, isExp = false;        //开头有空格        while (s[i] == ' ') {            i++;        }        //不是数字开头        if (s[i] < '0' || s[i] > '9') {            //开头可以是小数点            if (s[i] == '.') {                //不过要注意不能同时是结尾 .   +                if (i == len - 1) {                    return false;                }                //".e1"不能直接接着e                isFloat = true;            } else {                //正负符号                if (s[i] != '+' && s[i] != '-') {                    return false;                }            }        }        i++;        while (i < len) {            //判断不是数字的情况,指数或小数            if (s[i] < '0' || s[i] > '9') {                //非法字符                if (s[i] != '.' && s[i] != 'e') {                    //正负号的前一个一定是e                    if (s[i] == '+' || s[i] == '-') {                        if (s[i - 1] != 'e') {                            return false;                        }                        //正负号不能在结尾                        if (i == len -1) {                            return false;                        }                    } else if (s[i] == ' ') {   //结尾都是空格也合法                        int j = i + 1;                        while (j < len) {                            if (s[j] != ' ') {                                return false;                            }                            j++;                        }                        //但是前面不是数字的就不行 10e这种算不算合法                        if (s[i - 1] == 'e') {                            return false;                        }                        //只有小数点和空格的也不行                        if (i == 1 && s[0] == '.') {                            return false;                        }                        return true;                    } else {                        return false;                    }                } else if (s[i] == '.') {   //小数点                    //小数点前面有小数点或e                    if (isFloat || isExp) {                        return false;                    }                    //至少有一边是数字                    if (s[i - 1] < '0' || s[i - 1] > '9') {                        if (i < len - 1) {                            if (s[i + 1] < '0' || s[i + 1] > '9') {                                return false;                            }                        } else {                            return false;                        }                    }                    isFloat = true;                } else {    //e                    //e在结尾 或 e前面有e ".e58" e前面没有数字                    if (i == len - 1 || isExp || (i == 1 && (s[0] < '0' || s[0] > '9'))) {                        return false;                    }                    isExp = true;                }            }            i++;        }        return true;    }};int main(int argc, const char * argv[]) {    Solution s;    string test = " 4e+";    cout << s.isNumber(test) << endl;    return 0;}
暂时显得有点乱,待改写。
0 0
原创粉丝点击