梁越

剑指53-表示数值的字符串

0 人看过

状态分析

题目描述

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

解法

分析所有会出现的情况,并指定是数值的条件

  • “e”或”E”后面只能跟”+””-“和数字,而且不能在开头,不能出现重复的”e”
  • “.”后面只能跟数字或者”e”和”E”,或在末尾,”.”前面不能出现”e”且”.”不能重复
  • “+””-“后面能跟数字或者”.”
  • 数字后面跟”.”或者”e”和”E”,或者数字,或者在最后
  • 不属于以上符号返回false

边界条件

边界条件1:有多个”.”或者多个”e”(如1.2.3)

边界条件2:”.”在”e”之后(如123e+1.2)

解决: 使用两个bool变量point和exp控制,当出现了”.”之后不能再出现”.”,当出现了”e”之后不能再出现”e”或”.”

代码

class Solution {
public:
    bool isNumeric(char* string)
    {
        //e或E后面只能跟+-和数字,而且不能在开头,不能出现重复的e
        //.后面只能跟数字或者e和E.或在末尾,.前面不能出现e且.不能重复
        //+-后面能跟数字或者.
        //数字后面跟.或者e和E,或者数字,或者在最后
        //不属于以上符号返回false

        //边界条件:有多个.或者多个e(1.2.3)
        //边界条件:.在e之后(123e+1.2)
        int lenth = strlen(string);
        bool point = false, exp = false;  //边界条件控制
        for (int i = 0; i < lenth; i++)
        {
            if (string[i] == 'e' || string[i] == 'E')
            {
                if (!exp && i != 0 && i + 1 < lenth && (string[i + 1] == '+' || string[i + 1] == '-' || isdigit(string[i + 1])))
                {
                    exp = true;
                    continue;
                }
                else return false;
            }
            else if (string[i] == '.')
            {
                if (!exp && !point && i != 0 && (i + 1 < lenth && (string[i + 1] == 'e' || string[i + 1] == 'E' || isdigit(string[i + 1]))))
                {
                    point = true;
                    continue;
                }
                else if (!exp && !point && i == lenth - 1) return true;
                else return false;
            }
            else if (string[i] == '+' || string[i] == '-')
            {
                if (i + 1 < lenth && (isdigit(string[i + 1]) || string[i + 1] == '.'))
                {
                    continue;
                }
                else return false;
            }
            else if (isdigit(string[i]))
            {
                if (i + 1 < lenth && (string[i + 1] == '.' || string[i + 1] == 'e' || string[i + 1] == 'E' || isdigit(string[i + 1])))
                {
                    continue;
                }
                else if (i == lenth - 1) return true;
                else return false;
            }
            else return false;
        }
        return true;
    }

};