20 表示数值的字符串

题目

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

牛客网 OJ
AcWing

C 语言题解

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

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

判断一个字符串是否符合上述模式时:

  • 首先看第一个字符是不是正负号。如果是,在字符串上移动一个字符,继续扫描剩余的字符串中0到9的数位。
  • 如果是一个小数,则将遇到小数点。
  • 另外,如果是用科学记数法表示的数值,在整数或者小数的后面还有可能遇到'e'或者'E'。
class Solution {
public:
    bool isNumeric(char* string)
    {
        // 异常输入检查
        if(string == NULL)
            return false;
        
        // 首先假定数字存在整数部分(可能带符号也可能不带符号)
        bool numeric = scanInteger(&string);
        
        // 假设存在小数点
        if(*string == '.')
        {
            // 越过小数点
            ++string;
            // 这里需要特别注意,先写scanUnsignedInteger(&string)如果写成
            // numeric = numeric || scanUnsignedInteger(&string);
            // 由于|| 的短路特性可能会导致错误
            // 小数点后面必须是无符号数,因为可能出现小数点前面无整型数的情况,所以此处是||
            numeric = scanUnsignedInteger(&string) || numeric;
        }
        
        // 假设存在指数形式
        if(*string == 'e' || *string == 'E')
        {
            // 越过指数标志
            ++string;
            
            // 指数后面必须跟着整数(可能带符号也可能不带符号)
            // e或者E前面必须有数字,不管是整数还是小数,所以此处用的是&&
            numeric = scanInteger(&string) && numeric;
        }
        
        // 最后比达到字符串的末尾
        return numeric && *string == '\0';
    }

    bool scanInteger(char **str)
    {
        // 此处采用指针的指针是为了参数修改在主调函数中同步
        if(**str == '+' || **str == '-')
            ++(*str);
        
        return scanUnsignedInteger(str);
    }
    
    bool scanUnsignedInteger(char **str)
    {
        char * before = *str;
        while(**str != '\0' && **str >= '0' && **str <= '9')
            ++(*str);
        
        // 此处是保证有无符号整数的存在
        return *str > before; 
    }

};

注意:

  • 上述的检查整数->小数->科学计数法的顺序是固定的,不可以调整顺序。
  • 使用 || &&时注意短路特性的影响。

C++ 题解

python 题解

直接强制转换成float类型,查看是否能够正确转换。

# -*- coding:utf-8 -*-
class Solution:
    # s字符串
    def isNumeric(self, s):
        # write code here
        try:
            return float(s)
        except:
            return 0
posted @ 2019-03-04 08:49  youngliu91  阅读(269)  评论(0编辑  收藏  举报