Not Only Algorithm,不仅仅是算法,关注数学、算法、数据结构、程序员笔试面试以及一切涉及计算机编程之美的内容 。。
你的位置:NoAlGo博客 » 题解 » 

Leetcode Valid Number

Leetcode algorithms 第 65 题: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.

解答

判断一个字符串是否是一个合法的数字。这题非常繁琐,需要考虑的细节非常多,这里罗列如下:

  • 字符串是否为NULL。
  • 数字不能有非法字符。
  • 数字可能带有前导空格和最后面的空格,中间不能有空格。
  • 数字可能带有显示的+号或者-号,但又不能只有正负号。
  • 数字可能带有小数点,但只能有一个小数点,小数点后至少要有一个数字。
  • 数字可能带有e表示10的幂次,e后至少有一个数字,但该数字可以带正负号,但又不能只有正负号。
  • 数字不能同时有e和小数点。

具体代码如下:

class Solution {
public:
    bool isNumber(const char *s) {
        if (!s) return false;
        while (isspace(*s)) s++;         //前导空格
        if (*s == '+' || *s == '-') s++; //正负号
        if (!*s) return false;
        
        bool hase = false, hasdot = false;
        const char *olds = s;
        for (; *s; s++)
        {
            if (isdigit(*s)) continue;
            else if (*s == '.')
            {
                if (hase || hasdot) return false; //同时有.和e
                if (s == olds && !isdigit(*(s+1))) return false; //至少有一个小数部位
                hasdot = true;
            }
            else if (*s == 'e')
            {
                if (hase || s == olds) return false; //同时又.和e
                s++;
                if (*s == '+' || *s == '-') s++;//正负号
                if (!isdigit(*s)) return false; //至少一个数字表示次方
                hase = true;
            }
            else if (isspace(*s))
            {
                while (*s) if (!isspace(*s++)) return false; //后续全为空格
                return true;
            }
            else //非法字符
                return false;
        }
        return true;
    }
};
上一篇: 下一篇:

我的博客

NoAlGo头像编程这件小事牵扯到太多的知识,很容易知其然而不知其所以然,但真正了不起的程序员对自己程序的每一个字节都了如指掌,要立足基础理论,努力提升自我的专业修养。

站内搜索

最新评论