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

第 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++ 代码:

《剑指 Offer (第 2 版)》第 20 题:表示数值的字符串_第1张图片
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 题:表示数值的字符串)