剑指offer 19 表示数值的字符串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaohaibo_/article/details/85882379

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

注意:

  1. 小数可以没有整数部分,例如.123等于0.123;
  2. 小数点后面可以没有数字,例如233.等于233.0;
  3. 小数点前面和后面可以有数字,例如233.666;
  4. 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
  5. 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;

样例:

输入: "0"

输出: true

class Solution {
public:
    bool isNumber(string s) {
        int n = s.length();
        if(n == 0) return false;
        if(n == 1) return isdigit(s[0]);
        unordered_map<char,int> hash;
        int digit = 0;
        if(s[0] != '+' && s[0] != '-' && !isdigit(s[0]) && s[0] != '.') return false;
        if(s[0] == '.') hash['.']++;
        for(int i = 1; i < n; i++) {
            if(s[i] == 'e' || s[i] == 'E') {
                if(!isdigit(s[i-1])) return false;
                if(i+1 == n || (!isdigit(s[i+1]) && s[i+1] != '-' && s[i+1] != '+')) return false;
                hash['e']++;
                hash['E']++;
                if(hash[s[i]] > 1) return false;
                continue;
            }
            if(s[i] == '.') {
                if(hash['e'] == 1 || hash['E'] == 1) return false;
                hash[s[i]]++;
                if(hash[s[i]] > 1) return false;
                continue;
            }
            if(s[i] == '-') {
                if((s[i-1] != 'e' && s[i-1] != 'E') || i+1 == n || !isdigit(s[i+1])) return false;
                continue;
            }
            if(s[i] == '+') {
                if((s[i-1] != 'e' && s[i-1] != 'E') || i+1 == n || !isdigit(s[i+1])) return false;
                continue;
            }
            if(isdigit(s[i])) digit++;
            else return false;
        }
        if(digit > 0) return true;
        else return false;
    }
};

猜你喜欢

转载自blog.csdn.net/zhaohaibo_/article/details/85882379