剑指Offer53-表示数值的字符串

在这里插入图片描述
这题难点只有边界问题的考虑,所以最好一开始就考虑全面点,省的不断的调bug,给面试官不好的印象。
那么结合上图中给的提示,大概有以下几种情况:

  1. e/E之前和e/E之后可以看做是两个部分。
  2. e/E之前的部分:
    +/-只能在头部出现,且只能出现一次;
    数字直接continue
    非e/E的字符出现,直接return False
    头部如果出现".",直接return False
    非头部如果出现一次".",后面如果再出现".",则return False
  3. e/E之后的部分:
    +/-只能在头部出现,且只能出现一次;
    如果有".",直接return False
    如果触发e/E之后的部分,e/E后没有其他数字了,要return False
    其他符号也要return False

以上即为全部的边界条件,通过多个flag去进行控制。
见代码

# -*- coding:utf-8 -*-
class Solution:
    # s字符串
    def isNumeric(self, s):
        # write code here
        flag = 0  # 是否有e/E,默认没有为0
        _flag = 0  # e/E后的加/减号的flag
        dot_flag = 0  # e/E前的“.”的flag
        
        i = 0
        count = 0  # 判断触发e/E后是否仍有数字
        if s[i] == '+':
            i += 1
        elif s[i] == '-':
            i += 1
        elif s[i] == '.':  # 头部如果出现".",直接return False
            return False

        for item in s[i:]:
            if flag == 0:  # e/E之前的部分
                if dot_flag == 1 and item == '.':
                    return False
                if '0' <= item <= '9':  # 数字直接continue
                    continue
                if item == 'e' or item == 'E':  # 触发e/E后的部分
                    flag = 1
                    continue
                if item == '.':
                # 非头部如果出现一次".",后面如果再出现".",则return False
                    dot_flag = 1
                    continue
                else:
                    return False
            else:
                count += 1
                # 如果触发e/E之后的部分,e/E后没有其他数字了,要return False
                if _flag == 1 and item == '-':
                # +/-只能在头部出现,且只能出现一次;
                    return False
                if item == '+':
                    _flag = 1
                    continue
                if item == '-':
                    _flag = 1
                    continue
                if item == '.':  # 有"."直接False
                    return False
                if '0' <= item <= '9':
                    continue
                else:
                    return False
        if flag == 1 and count == 0:
            return False
        return True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xu_Wave

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值