【剑指 Offer 20. 表示数值的字符串 中等】

【剑指 Offer 20. 表示数值的字符串 中等】

 

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。".123"是。自动忽略首尾的空格

一个符合条件的数字格式为:[sign](0-9)[.][ [e/E] [sign](0-9) ]。具体细节参照代码

class Solution {
public:
    bool scanUnsignedNumber(string s, int& i, int len) {
        int before = i;
        while(i < len && s[i] >= '0' && s[i] <= '9')
            ++i;
        return i > before;
    }
    bool scanNumber(string s, int& i, int len) {
        if(s[i] == '+' || s[i] == '-')
            ++i;
        return scanUnsignedNumber(s, i, len);
    }
    
    bool isNumber(string s) {
        int len = s.length();
        if(len == 0)
            return false;
        int i = 0;
        while(s[i] == ' ')
            ++i;
        bool isNumber = scanNumber(s, i, len);
        cout<<isNumber<<endl;
        if(s[i] == '.') {
            ++i;
            cout<<"*"<<i<<" "<<len<<endl;
            isNumber =  scanUnsignedNumber(s, i, len) || isNumber;  // 处理“.123”的这种情况
        }
        if(s[i] == 'e' || s[i] == 'E') {
            ++i;
            isNumber = isNumber && scanNumber(s, i, len);
        }
        while(s[i] == ' ')
            ++i;
        return i == len && isNumber;
    }
};

 

posted @ 2021-03-30 15:56  蓦然闻声  阅读(41)  评论(0编辑  收藏  举报