[LeetCode]—Valid Number 判断字符串是否为合法数据(科学计数法)

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.

该题目测试数据集特别丰富。

主要注意以下明显情况:

      1、前后出现空白。

      2、2e或者2E,E后面未接其他数字是false的

      3、小数点出现的位置。(只能在e前)

      4、e前面要有数据出现 ".E"或“.”是不对的

很经典的一个划分,就是以E为界限,划分为前后2部分 firstPart 和secondPart 来讨论各种情况。

最后:根据数据集慢慢测试调整。


学习下文后,得出代码:http://www.cnblogs.com/remlostime/archive/2012/11/18/2775938.html

class Solution {
public:
    bool isNumber(const char *s) {
        assert(s);
        int n=strlen(s);
        const char *end;
        end= s+n-1;

        bool dotAppear=false;
        bool eAppear=false;
        bool firstPart=false;  //以E为分界线
        bool secondPart=false;
        
        while(isspace(*s))s++;
        while(isspace(*end))end--;
        
        if(*s=='+'|| *s=='-')s++;

        while(s!=(end+1)){
           if(isdigit(*s)){
             if(!eAppear)
                 firstPart=true;
             else
                secondPart=true;
           }
           else if(*s=='.'){
              if(dotAppear ||eAppear || secondPart)
                    return false;
              else
                  dotAppear=true;
           }
           else if(*s=='e' || *s=='E'){
              if(eAppear)
                  return false;
              else
                  eAppear=true;
           
           }
           else if(isspace(*s))
           {
                    return false;
           }
           else if(*s=='+' || *s=='-'){
                 if(*(s-1)=='e' || *(s-1)=='E')
                    ;
                 else 
                     return false;
           }
           else{
               return false;
           }

           s++;
        }

       if(!firstPart)return false; 
       else if(eAppear && !secondPart)
           return false;
       return true;
            
    }
};



还有一种方法:判断是否为数字,类似于函数strtod()

函数名: strtod 
功  能: 将字符串转换为double型值 
用  法: double strtod(char *str, char **endptr); 

函数说明:strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束时('\0')才结束转换,并将结果返回。若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或123e-2。


// @author 连城(http://weibo.com/lianchengzju)
/*调用strtod()*/
class Solution{
public:
    bool isNumber(const char *s){
    char *endptr;

    strtod(s,&endptr);  
   
    if(endptr==s)return false;   //数字就不存在 例如:s="   "

    for(;*endptr!='\0';++endptr)  
        if(!isspace(*endptr))return false;  //如果剩余的不是空格,就表示出错。   

        return true;
    }
};


你可能感兴趣的:(数据结构与算法)