【剑指Offer】【字符串】表示数值的字符串

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

 A:格式有 A[.B][E|e C]  或 .B[E|e C]   ===> A整数  B小数  C指数

  取三个标记:符号标记、小数点标记、E|e标记

 (1)判断当前字符是否是'E'或'e',E|e后一定要接数字,而且不能同时存在两个e

 (2)判断当前字符是否是'+'或'-',第一次出现符号且不是整数部分时,必须在e之后;第二次出现符号必须在e之后;

 (3)判断当前字符是否是'.'小数点,小数点不能出现两次,而且不能在指数部分

 (4)如果当前字符不是以上5种符号,且不为数字,则返回false

 

class Solution {
public:
        bool isNumeric(char* str)
        {
            bool flag_sign = false;     //符号
            bool flag_decimal = false;  //小数点
            bool flag_hasE = false;     //e/E
            for (int i = 0; i < strlen(str); i++) 
            {
                if ((str[i] == 'e') || (str[i] == 'E'))
                {
                    if (i == strlen(str) - 1) 
                    {
                        return false; // e后面一定要接数字
                    }
                    if (flag_hasE) 
                    {
                        return false;  // 不能同时存在两个e
                    }
                    flag_hasE = true;
                } 
                else if ((str[i] == '+') || (str[i] == '-'))
                {
                    // 第二次出现+-符号,则必须紧接在e之后
                    if (flag_sign && ((str[i - 1] != 'e') && (str[i-1] != 'E')))
                    {
                        return false;
                    }
                    // 第一次出现+-符号,且不是在字符串开头,则也必须紧接在e之后
                    if (!flag_sign && (i > 0) && ((str[i-1] != 'e') && (str[i-1] != 'E')))
                    {
                        return false;
                    }
                    flag_sign = true;
                } 
                else if (str[i] == '.') 
                {
                    // e后面不能接小数点,小数点不能出现两次
                    if (flag_hasE || flag_decimal)
                    {
                        return false;
                    }
                    flag_decimal = true;
                } 
                else if ((str[i] < '0') || (str[i] > '9')) // 不合法字符
                {
                    return false;
                }
            }
            return true;
        }
};

  

 

 

 

相关题目

  字符串匹配:牛牛有两个字符串A和B,其中A串是一个01串,B串中除了可能有0和1,还可能有'?',B中的'?'可以确定为0或者1。 寻找一个字符串T是否在字符串S中出现的过程,称为字符串匹配。牛牛现在考虑所有可能的字符串B,有多少种可以在字符串A中完成匹配。

  字符串分类:牛牛有N个字符串,他想将这些字符串分类,他认为两个字符串A和B属于同一类需要满足以下条件:A中交换任意位置的两个字符,最终可以得到B,交换的次数不限。比如:abc与bca就是同一类字符串。现在牛牛想知道这N个字符串可以分成几类。

  字符串价值:有一种有趣的字符串价值计算方式:统计字符串中每种字符出现的次数,然后求所有字符次数的平方和作为字符串的价值例如: 字符串"abacaba",里面包括4个'a',2个'b',1个'c',于是这个字符串的价值为4 * 4 + 2 * 2 + 1 * 1 = 21牛牛有一个字符串s,并且允许你从s中移除最多k个字符,你的目标是让得到的字符串的价值最小。

posted @ 2019-08-27 20:39  XieXinBei0318  阅读(197)  评论(0)    收藏  举报