剑指offer 50.表示数值的字符串

  1. 题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
  2. 思路:
    1. 字符串处理的题目,考虑到各种意外情况
      1. 小数点不能出现两次
      2. 不能出现两个e
      3. e不能作为最后一个字符
      4. e不能在小数点之前,e可以在小数点之后
      5. +-没有出现在首字符,出现在字符串中间,那前一个一定是e或者E
  3. 启发或者坑:
    1. 最早做这个题目的时候,没有对e有着清楚的认知,所以debug一段时间,后来看了discuss之后get到了e的要求
  4. 代码:
    class Solution {
    public:
        bool isNumeric(char* string)
        {
            bool hasPoint = false; //  小数点不能出现两次
            bool hasE = false; //不能出现两个e
            //考虑多种情况,字符串只能是0-9,e,E,+,-,.
            for (int i = 0 ; i < strlen(string); i++) {
                if (!isRightChar(string[i]))
                    return false;
                if (string[i] == 'e' || string[i] == 'E') {
                    //e后面必须跟东西,比如+,比如数字,比如-
                    if (i == strlen(string)-1)
                        return false;
                    //一个表达式只能有一个e
                    if (hasE)
                        return false;
                    hasE = true;
                }
                if (string[i] == '+') {
                    if (i != 0) {
                        if (string[i-1] != 'E' && string[i-1] !='e')
                            return false;
                    }
                }
                if (string[i] == '-') {
                    if (i != 0) {
                        if (string[i-1] != 'E' && string[i-1] !='e')
                            return false;
                    }
                }
                if (string[i] == '.') {
                    if (hasPoint)
                        return false; //如果点出现2次,返回false
                    //如果e在点之前,也返回false
                    if (hasE)
                        return false;
                    hasPoint = true;
                }
            }
            return true;
        }
         
        bool isRightChar(char c) {
            if (c >= '0' && c <= '9')
                return true;
            if (c == 'e' || c == 'E' || c == '+' || c == '-' || c == '.')
                return true;
            return false;
        }
     
    };
    
发布了131 篇原创文章 · 获赞 5 · 访问量 7376

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/104093550