zoukankan      html  css  js  c++  java
  • LeetCode:Valid Number

    题目链接

    Validate if a given string is numeric.

    Some examples:
    "0" => true
    " 0.1 " => true
    "abc" => false
    "1 a" => false
    "2e10" => true                                                          本文地址

    Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.


    分析:首先需要知道哪些是合法的数字表示:比如 .2 , 2. 都是合法的小数表示,e的左右两边必须要有数字,还要注意正负号。这个如果用正则表达式很简单,但是c++的标准库貌似还没有完全实现正则表达式模块([-+]?(\d+\.?|\.\d+)\d*(e[-+]?\d+)? )。也可以自己写有限状态机来模拟正则表达式。

    可以参考coder’s creed的博客有限状态机解法:http://www.cnblogs.com/chasuner/p/validNumber.html

    unieagle的解法其实也是记录状态:http://blog.unieagle.net/2012/11/06/leetcode%E9%A2%98%E7%9B%AE%EF%BC%9Avalid-number/

    下面的代码就是纯粹的判断,逻辑性太差:

    class Solution {
    public:
        bool isNumber(const char *s) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            if(s == NULL)return false;
            int len = strlen(s);
            int i = 0, j = len-1;
            while(i < len && s[i] == ' ')i++;//去掉首部空格
            if(i == len)return false;
            else if(s[i] == '-')i++;
            else if(s[i] == '+')i++;
            while(j >=0 && s[j] == ' ')j--;//去掉尾部空格
            len = j+1;
            int istart = i;
    
            while(i < len && s[i] >= '0' && s[i] <= '9')i++;
            if(i == len )
            {
                if(s[i-1] != '-' && s[i-1] != '+')return true;
                else return false;
            }
    
            if(s[i] == '.')
            {
                int doti = i;
                i++;
                while(i < len && s[i] >= '0' && s[i] <= '9')i++;
                if((doti == istart || s[doti-1] == '-' ||
                    s[doti-1] == '+') && i == doti+1)return false;
                if(i == len)
                    return true;
            }
    
            if(s[i] == 'e' || s[i] == 'E')
            {
                if(i == istart || s[i-1] == '-' || s[i-1] == '+')return false;
                if(s[++i] == '-' || s[i] == '+')i++;
                while(i < len && s[i] >= '0' && s[i] <= '9')i++;
                if(i == len)
                {
                    if(s[i-1] < '0' || s[i-1] >'9')return false;
                    return true;
                }
                else return false;
            }
            else return false;
        }
    };

    【版权声明】转载请注明出处http://www.cnblogs.com/TenosDoIt/p/3475305.html

  • 相关阅读:
    pytest实现参数化(@pytest.mark.parametrize)
    pytest标记测试用例为预期失败(@pytest.mark.xfail)
    pytest标记跳过某些测试用例不执行
    pytest的conftest.py配置
    pytest之fixture使用
    模拟赛42 题解
    模拟赛41 题解
    一些可能永远用不到的性质
    补锅
    骗分杂谈
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3475305.html
Copyright © 2011-2022 走看看