Leetcode-Valid Number

http://oj.leetcode.com/problems/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.

思路

说实话,这题目不难,很难受的是要考虑的情况太多了……AC的代码我用它的case去跑。感觉还有错的,还有就是引号转义的问题。恩,需要mark一下。 读取整行,可以有空格,遇到回车停止。fgets(s,100,fp)当然,case不会超过100个字符,第二个参数随意设定的。 用while(cin>>s)不能遇到空格,用gets会报警。

AC代码

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>

using namespace std;

bool isNumber(const char *s) 
{

        int len=strlen(s);
        if(len<=0) return false;

        int space_nums=0;
        int num_nums=0;
        int dot_nums=0;
        int e_nums=0;
        int sign_nums=0;
        int e_sign_nums=0;

        int after_e_nums=0;


        int new_len=len-1;
        for(;new_len>=0;new_len--)
        {
            if(s[new_len]!=' ')break;
        }

        for(int i=0;i<=new_len;i++)
        {
            if(s[i]=='.')
            {
                if(dot_nums>0) 
                    return false;
                else if(e_nums>0) 
                    return false;
                else 
                    dot_nums=1;
            }
            else if(e_nums==1 && after_e_nums==0 &&(s[i]=='+' || s[i]=='-'))
            {
                if(e_sign_nums>0) 
                    return false;
                else 
                    e_sign_nums=1;
            }
            else if(s[i]=='+' || s[i]=='-')
            {
                if(sign_nums>0 || dot_nums>0) 
                    return false;
                else if(num_nums>0) 
                    return false;
                else 
                    sign_nums=1;
            }
            else if(s[i]=='e')
            {
                if(num_nums==0)
                    return false;
                else if(e_nums>0) 
                    return false;
                else 
                    e_nums=1;
            }
            else if(s[i]>='a' && s[i]<='z')
            {
                return false;
            }
            else if(s[i]>='A' && s[i]<='Z')
            {
                return false;
            }
            else if(s[i]==' ')
            {
                if(num_nums>0 || sign_nums>0 || dot_nums>0)
                    return false;
                else if(num_nums==0)
                    continue;
                else if(space_nums>0) 
                    return false;
                else 
                    space_nums++;
            }
            else
            {
                num_nums++;
                if(e_nums>0) 
                    after_e_nums++;
            }
        }
        if(num_nums==0) 
            return false;
        else if(e_nums>0 && after_e_nums==0) 
            return false;

        return true;
}

int main()
{
        char *s;
        /*cin>>s;
        if(isNumber(s))
            cout<<"true"<<endl;
        else
            cout<<"false"<<endl;*/

    FILE *fp;
    #ifndef isnumber
        fp = freopen("in1.in","r",stdin);
        freopen("std1.out","w",stdout);
    #endif

        while(fgets(s,100,fp))
        {
            if(isNumber(s))
                cout<<"true"<<endl;
            else
                cout<<"false"<<endl;
        }

    #ifndef isnumber
        fclose(stdin);
        fclose(stdout);
    #endif

        return 0;
}