• 表示数字的字符串


    题目描述

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
     
    class Solution {
    public:
        bool isNumeric(char* string)
        {
      
    		int len=strlen(string);
            int i=0,dot=0,nume=0,num=0;
            if(len==0)
                return true;
            if(string[0]=='+'||string[0]=='-')
                i++;
           while(i<len){
                if(string[i]>='0'&&string[i]<='9'){
                    i++;
                    num=1;
                }
                else if(string[i]=='.'){
                    if(nume>0)
                        return false;
                    dot++;
                    i++;
                }
                else if(string[i]=='e' ||string[i]=='E'){
                    if(nume>0 || num==0)
                        return false;
                    nume++;
                    i++;
                    if(string[i]=='-'||string[i]=='+')
                        i++;
                    if(string[i]=='')
                        return false;
                }
                else
                    return false;
                       
            }
            if(dot>1 ||nume>1)
                return false;
            return true;
        }
    
    };
    

      

    class Solution {
    public:
        bool isNumeric(char* str) {
            // 标记符号、小数点、e是否出现过
            bool sign = false, decimal = false, hasE = false;
            for (int i = 0; i < strlen(str); i++) {
                if (str[i] == 'e' || str[i] == 'E') {
                    if (i == strlen(str)-1) return false; // e后面一定要接数字
                    if (hasE) return false;  // 不能同时存在两个e
                    hasE = true;
                } else if (str[i] == '+' || str[i] == '-') {
                    // 第二次出现+-符号,则必须紧接在e之后
                    if (sign && str[i-1] != 'e' && str[i-1] != 'E') return false;
                    // 第一次出现+-符号,且不是在字符串开头,则也必须紧接在e之后
                    if (!sign && i > 0 && str[i-1] != 'e' && str[i-1] != 'E') return false;
                    sign = true;
                } else if (str[i] == '.') {
                  // e后面不能接小数点,小数点不能出现两次
                    if (hasE || decimal) return false;
                    decimal = true;
                } else if (str[i] < '0' || str[i] > '9') // 不合法字符
                    return false;
            }
            return true;
        }
    };
    几个关键点:
    1.基本边界。     string == NULL || *string == ''

    2.检测是否有符号位

    3.检测除符号位外的第一个有效位,有效位只能是数字或者小数点.

    4.检测是否有E或者e,且不能重复出现

    5.小数点不能重复出现

    6.数字的合法性,不能是其他字母如‘a’等

    代码如下:
    用了重载函数,设置参数hasPoint、hasEe来判断E、e、小数点是否重复出现
    链接:https://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2
    来源:牛客网
    
    bool isNumeric(char* string)
        {
            return isNumeric(string, false, false);
        }
     
        bool isNumeric(char* string, bool hasPoint, bool hasEe)
        {
            // 基本边界
            if(string == NULL || *string == '') {
                return false;
            }
     
            // 检测是否有符号位
            bool isMinus = false;
            if(*string == '-') {
                isMinus = true;
                string++;
            } else if(*string == '+') {
                isMinus = false;
                string++;
            }
     
            // 检测第一个数字或者小数点是否存在
            if((*string >= '0' && *string <= '9') || *string == '.') {
                string++;
            } else {
                return false;
            }
     
            while(*string != '') {
                // 是否为E或者e
                if(*string == 'E' || *string == 'e') {
                    if(hasEe == true) {
                        return false;
                    } else {
                        if(isNumeric(string+1, true, true)) {
                            return true;
                        } else {
                            return false;
                        }
                    }
                }
     
                // 是否为小数点.
                if(*string == '.') {
                    if(hasPoint == true) {
                        return false;
                    } else {
                        hasPoint = true;
                        string++;
                    }
                } else if(*string >= '0' && *string <= '9') {
                    // 是否为合法数字
                    string++;
                } else {
                    return false;
                }
            }
     
            // 如果不是所有不合法,则返回true
            return true;
        }
     
    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    高级算法(1):
    spark浅谈(3):
    linux学习笔记(1):
    数据分析之pandas(1)
    数据分析之期权
    数据分析之蒙特卡洛模拟
    未能加载文件或程序集"xxxxxx"或它的某一个依赖项
    未能映射路径"/"
    部署MVC项目ManagedPipelineHandler报错
    IIS记录
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7446849.html
Copyright © 2020-2023  润新知