剑指offer 表示数值的字符串(C++)

题目描述

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

解题思路

  • 这是一道需要考虑情况非常多的题目,包括case的情况都没有完全覆盖,比如没有对 “123.45ee+6” 这种情况进行考虑(非法的,OJ判合法)。
  1. 空字符返回false。

  2. 非法字符返回false。即出现a b 等等。

  3. 如果只有唯一一个字符的时候,必须是0 到 9 之间的数字字符。

  4. 首字符如果是运算符(+ - ),第二个字符必须是0 到 9 之间的数字 或者是 小数点(-.123)也是合理的字符。

  5. 字符中的小数点只能出现一次。

  6. 判断e/E是否存在:
    存在:

    1. e/E 只能出现1次。
    2. e/E 前面 除首字符外,不能出现运算符。
    3. e/E 后一位 允许出现 运算符。
    4. e/E 后面 不允许出现小数。
    5. e/E 不能是最后一个字符。

    不存在:

    1. 运算符如果存在只能是首字符。 不能出现在字符串中间。

代码实现

class Solution {
public:
    // 1、判断字符串是否为空
    bool IsEmpty(char* string)
    {
        if (strlen(string) == 0)
            return false;
        return true;
    }
    // 2、判断所有字符均是合法字符
    bool IsLeaglString(char* string)
    {
        int i = 0;
        for (; i < strlen(string); i++)
        {
            if ((string[i] >= '0' and string[i] <= '9') or
                string[i] == '.' or string[i] == '+' or
                string[i] == '-' or string[i] == 'E' or
                string[i] == 'e')
                continue;
            return false;
        }
        return true;
    }
    // 3、只有一个字符时候 必须是0 到 9之间的字符
    bool Onechar(char* string)
    {
        if (strlen(string) == 1)
        {
            if (string[0] >= '0' and string[0] <= '9')
                return true;
            else
                return false;
        }
        return false;
    }
    // 4、如果首字符是运算符 第二个字符必须是 0 到 9 之间的数  或者是 .  例如 -.123
    // 如果首字符不是运算符 必须是0 到 9之间的数字
    bool isOperator(char* string)
    {
        if (string[0] == '-' or string[0] == '+')
            if ((string[1] >= '0' and string[1] <= '9') or string[1] == '.')
                return true;
        else
            return false;
        if (string[0] >= '0' and string[0] <= '9')
            return true;
        return false;
    }
    // 6、小数点必须只有一个
    bool isOnlyOneDot(char* string)
    {
        int num = 0;
        for (int i = 0; i < strlen(string); i++)
        {
            if (string[i] == '.')
                num++;
        }
        if (num < 2)
            return true;
        return false;
    }
    // 7、判断是否有e/E的存在 返回e的位置
    int isExsitE(char* string, int *num)
    {
        int i = 0, location = 0;
        for (; i < strlen(string); i++)
        {
            if (string[i] == 'E' or string[i] == 'e')
            {
                location = i;
                (*num)++;
            }

        }
        if (location == 0)
        {
            return -1;
        }
        return location;
    }
    // 8、不存在E/e 运算符只能在最前面
    bool isLegelOperator(char* string)
    {
        for (int i = 1; i < strlen(string); i++)
            if (string[i] == '+' or string[i] == '-')
                return false;
        return true;
    }
    // 9、如果有E/e存在 判断是否合法
    bool isLegalE(char* string, int i)
    {
        int k = 1;
        for (; k < i; k++)
            if (string[k] == '+' or string[k] == '-')
                return false;
        i++;
        // E/e 是最后一个字符 返回false
        if (i == strlen(string))
            return false;
        // e/E后面有小数点 返回false
        int j = i;
        for (; j < strlen(string); j++)
            if (string[j] == '.')
                return false;
        // 如果是 - 或 +  , - 或 + 后面还必须有字符
        if (string[i] == '-' or string[i] == '+')
            if (++i == strlen(string))
                return false;
        return true;
    }
    bool isNumeric(char* string)
    {
        if (IsEmpty(string)) // 字符串不空
        {
            if (IsLeaglString(string)) // 不存在非法字符
            {
                if (Onechar(string)) // 如果只有一个字符时
                    return true;
                else
                {
                    // 判断首字符是否合法
                    if (isOperator(string))
                    {
                        // 小数点必须只有一个
                        if (isOnlyOneDot(string))
                        {
                            // 判断e是否存在
                            int num = 0; // 统计e/E的个数
                            int i = isExsitE(string, &num);
                            if (num > 1)
							    return false;
                            if (i == -1) // e不存在
                            {
                                // 判断运算符位置
                                if (isLegelOperator(string))
                                    return true;
                                else
                                    return false;
                            }
                            else // e存在
                            {
                                if (isLegalE(string, i))
                                    return true;
                                else
                                    return false;
                            }
                        }
                        else
                            return false;
                    }
                    else
                        return false;
                }
            }
        }
        return false;
    }
};
  • 本题目是剑指offer 中代码量最大的一道题目。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值