• (剑指Offer)面试题54:表示数值的字符串


    题目:

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。

    但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

    思路:

    表示数值的字符串遵循如下模式:

    [sign]integral-digits[.[fractional-digit]][e|E[sign]exponential-digits]

    说明一下:在数值之前可能有正负符号'+',‘-’,接下来是若干0-9的数位表示数值的整数部分(在某些小数里可能没有整数部分)。如果数值是一个小数,那么在小数点后面可能会有若干0到9的数位表示数值的小数部分,如果数值用科学计数法表示,接下来是一个‘e’或‘E’,以及紧跟着一个整数(可以有正负号)表示指数。

    判断一个字符串是否满足上述模式,首先看第一个字符是否为正负符号,如果是在字符串往前移动一个字符,继续扫描字符串剩下中0-9的位数,如果是一个小数,则将遇到小数点,如果是科学计数法,在整数或者小数后面可能会遇到‘e’或‘E’.

    代码:

    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    void scanDigits(char** string){
        while(**string!='' && **string>='0' && **string<='9')
            ++(*string);
    }
    
    bool isExponential(char** string){
        if(**string!='e' && **string!='E')
            return false;
    
        ++(*string);
        if(**string=='+' || **string=='-')
            ++(*string);
        if(**string=='')
            return false;
    
        scanDigits(string);
        return (**string=='')?true:false;
    }
    
    bool isNumeric(char* string){
        if(string==NULL)
            return false;
    
        if(*string=='+' || *string=='-')
            ++string;
        if(*string=='')
            return false;
    
        bool numeric=true;
    
        scanDigits(&string);
    
        if(*string!=''){
            if(*string=='.'){
                ++string;
                scanDigits(&string);
                if(*string=='e' || *string=='E')
                    numeric=isExponential(&string);
            }
            else if(*string=='e' || *string=='E')
                numeric=isExponential(&string);
            else
                numeric=false;
        }
    
        return numeric && *string=='';
    }
    
    
    int main()
    {
        cout << isNumeric("5e2") << endl;
        cout << isNumeric("12e") << endl;
        cout << isNumeric("1a3.14") << endl;
        cout << isNumeric("+-5") << endl;
        return 0;
    }

    在线测试OJ:

    http://www.nowcoder.com/books/coding-interviews/6f8c901d091949a5837e24bb82a731f2?rp=3

    AC代码:

    class Solution {
    public:
        bool isNumeric(char* string)
        {
            if(string==NULL)
                return false;
            
            int len=strlen(string);
            int index=0;
            if(string[index]=='+' || string[index]=='-')
            	++index;
            
            if(index>=len)
                return false;
            
            bool numeric=true;
            scanDigit(string,index);
            
            if(index<len){
                if(string[index]=='.'){
                    ++index;
                    scanDigit(string,index);
                    if(index>=len)
                        numeric=true;
                    else if(string[index]=='e' || string[index]=='E')
                        numeric=isExponential(string,index);
                    else
                        numeric=false;
                }
                else if(string[index]=='e' || string[index]=='E')
                    numeric=isExponential(string,index);
                else
                    numeric=false;
            }
            
            return numeric;      
        }
        
        void scanDigit(char* string,int& index){
            while(string[index]!='' && string[index]>='0' && string[index]<='9')
                ++index;
        }
        
        bool isExponential(char* string,int index){
            if(string[index]!='e' && string[index]!='E')
                return false;
            ++index;
            if(string[index]=='+' || string[index]=='-')
                ++index;
            if(string[index]=='')
                return false;
            scanDigit(string,index);
            
            return (string[index]=='')?true:false;
        }
    
    };
    

      

  • 相关阅读:
    ExtJS专题(十):layout布局的使用(3)
    ExtJS专题(十一):lTree的Treepanel使用
    ExtJS专题(四):ExtJS组件的属性
    ExtJS专题(七):ExtJS面板Panel中视图区ViewPort的使用
    ExtJS专题(二):ExtJS类库和组件介绍
    ExtJS专题(十):layout布局的使用(1)
    EXtJS专题(九):ExtJS对话框的使用
    ExtJS专题(五):ExtJS面板Panel的使用
    ExtJS专题(三):ExtJS组件的使用
    ExtJS专题(八):ExtJS窗口Window的使用
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4700611.html
Copyright © 2020-2023  润新知