美文网首页
《剑指 Offer (第 2 版)》第 20 题:表示数值的字符

《剑指 Offer (第 2 版)》第 20 题:表示数值的字符

作者: 李威威 | 来源:发表于2019-05-26 00:05 被阅读0次

    第 20 题:表示数值的字符串

    传送门: 表示数值的字符串牛客网 online judge 地址

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

    例如,字符串"+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

    Python 代码:

    class Solution(object):
        def isNumber(self, s):
            """
            :type s: str
            :rtype: bool
            """
            size = len(s)
    
            # 1、去掉多余的空格
            i = 0
            while i < size and s[i] == ' ':
                i += 1
    
            j = size - 1
            while j >= 0 and s[j] == ' ':
                j -= 1
            if i > j:
                return False
    
            s = s[i:j - i + 1]
            # 2、首字母可以是加号或者减号
            if s[0] == '+' or s[0] == '-':
                s = s[1:]
            
            if len(s) == 0:
                return False
            # 3、只有 1 个点,不行
            if len(s) == 1 and s[0] == '.':
                return False
            # 4、下面对点的个数和 e 的个数展开讨论
            
            # 点的个数
            dot_cnt = 0
            # e 的个数
            e_cnt = 0
    
            size = len(s)
            i = -1
            while i < size - 1:
                i += 1
                if '0' <= s[i] <= '9':
                    continue
                elif s[i] == '.':
                    dot_cnt += 1
                    # 如果没有 e,并且点的数量大于 1,不符合要求
                    if e_cnt or dot_cnt > 1:
                        return False
                elif s[i] == 'e' or s[i] == 'E':
                    e_cnt += 1
                    if i == 0 or i == size - 1 or e_cnt > 1:
                        return False
                    # '.' 后面不能加上
                    if i == 1 and s[0] == '.':
                        return False
                    if s[i + 1] == '+' or s[i + 1] == '-':
                        if i + 2 == size:
                            return False
                        i += 1
                else:
                    return False
            return True
    
    
    if __name__ == '__main__':
        solution = Solution()
        s = '123.45e+6'
        result = solution.isNumber(s)
        print(result)
    

    “大雪菜”的解法:https://www.acwing.com/solution/acwing/content/737/

    C++ 代码:

    image-20190108005159319

    C++ 代码:

    class Solution {
    public:
        bool isNumber(string s) {
            int i = 0;
            while (i < s.size() && s[i] == ' ') i ++ ;
            int j = s.size() - 1;
            while (j >= 0 && s[j] == ' ') j -- ;
            if (i > j) return false;
            s = s.substr(i, j - i + 1);
    
            if (s[0] == '-' || s[0] == '+') s = s.substr(1);
            if (s.empty() || s[0] == '.' && s.size() == 1) return false;
    
            int dot = 0, e = 0;
            for (int i = 0; i < s.size(); i ++ )
            {
                if (s[i] >= '0' && s[i] <= '9');
                else if (s[i] == '.')
                {
                    dot ++ ;
                    if (e || dot > 1) return false;
                }
                else if (s[i] == 'e' || s[i] == 'E')
                {
                    e ++ ;
                    if (i + 1 == s.size() || !i || e > 1 || i == 1 && s[0] == '.') return false;
                    if (s[i + 1] == '+' || s[i + 1] == '-')
                    {
                        if (i + 2 == s.size()) return false;
                        i ++ ;
                    }
                }
                else return false;
            }
            return true;
        }
    };
    
    
    

    作者:yxc
    链接:https://www.acwing.com/solution/acwing/content/737/
    来源:AcWing
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:《剑指 Offer (第 2 版)》第 20 题:表示数值的字符

          本文链接:https://www.haomeiwen.com/subject/dhtizqtx.html