1. 首页
  2. 剑指offer经典面试题

[剑指 Offer 第 2 版第 20 题] “表示数值的字符串”做题记录

[剑指 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++ 代码:

liwei201910114_1.png

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 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:liweiwei1419

来源:https://liweiwei1419.github.io/sword-for-offer/


看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:[剑指 Offer 第 2 版第 20 题] “表示数值的字符串”做题记录

    链接:https://www.javajike.com/article/3269.html

« [剑指 Offer 第 2 版第 19 题] “正则表达式匹配”做题记录
[剑指 Offer 第 2 版第 21 题] “调整数组顺序使奇数位于偶数前面”做题记录»

相关推荐

QR code