剑指 Offer 20. 表示数值的字符串 - leetcode 剑指offer系列
发布日期:2021-06-29 07:11:56
浏览次数:3
分类:技术文章
本文共 2367 字,大约阅读时间需要 7 分钟。
题目难度: 中等
今天继续更新剑指 offer 系列, 这道题虽然难度是中等, 但通过率巨低, 应该是边界情况比较多的原因. 而各种边界条件也是面试比较爱考察的部分, 所以很值得一做
老样子晚上 6 点 45 分准时更新公众号 每日精选算法题, 大家记得关注哦~ 另外在公众号里回复 offer 就能看到剑指 offer 系列当前连载的所有文章了
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。
题目样例
示例
"0" => true" 0.1 " => true"abc" => false"1 a" => false"2e10" => true" -90e3 " => true" 1e" => false"e3" => false" 6e-1" => true" 99e2.5 " => false"53.5e93" => true" --6 " => false"-+3" => false"95a54e53" => false
题目思考
- 如何高效地处理各类情况?
- 边界情况分为几类?
解决方案
思路
分析
- 首先确定字符串中允许有哪些字符, 以及各自需要满足什么条件 (如果面试遇到这种问题, 在模糊的地方一定要多沟通细节, 比如前导 0, 小数点位置等):
- 数字
- 数量没有上限, 但至少需要有 1 个
- 无需处理前导 0 (因为题目用例里 0123 是有效的)
e
- 只能有 1 个
- 不能是大写 E
- 左右都必须有至少一个数字
+/-
e
的两边可以每边最多出现 1 个- 都必须在开头
.
- 只能有 1 个
- 只能出现在
e
之前 - 可以出现在开头符号之后或数字之间
- 空格
- 只能出现在开头和末尾
- 数字
- 根据上面分析, 一个自然的思路就是按照
e
将数字分为左右两部分, 其中右边唯一要求是不能有小数点, 别的和左边一样 - 这样我们就可以将分析数字的部分提取成一个方法, 额外传入一个 flag 表示是否可以有小数点, 然后分左右两部分判断即可~ 当然如果没有
e
的话那直接判断一次就行
实现
- 下面代码完全基于上述分析实现, 必要步骤都有详细注释
复杂度
- 时间复杂度
O(N)
- 只需要对每个字符判断一次
- 空间复杂度
O(1)
- 只使用了常数个变量
代码
class Solution: def isNumber(self, s: str) -> bool: # 先要把首尾空格去掉 # 然后判断是否有e # 有的话分成左右两部分check, 左边可以有小数, 右边不能有 # 注意小数点可以位于任意位置.. # 注意e之后不能有小数点 # 注意每一部分判断时需要保证至少有一个数字 s = s.strip() def isValid(s, allowdot): hasNum = False hasDot = False for i, c in enumerate(s): if c == '+' or c == '-': # 先判断符号, 如果不是在开头, 直接返回False if i != 0: return False elif c == '.': if not allowdot: # 当前不能有小数点, 返回False return False if hasDot: # 已经有一个小数点了, 返回False return False hasDot = True elif c.isnumeric(): # 注意这里至少需要满足有一个数字 hasNum = True else: # 其他字符都不满足, 直接返回False (包括e, 因为e只允许有一个, 有的话已经作为分隔符用掉了) return False return hasNum e = s.find('e') if e == -1: # 当前字符串没有e, 直接判断整体即可, 也允许小数点 return isValid(s, True) else: # 分为左右部分分别判断, 左边可以有小数点, 右边不行 return isValid(s[0:e], True) and isValid(s[e + 1:], False)
大家可以在下面这些地方找到我~😊
我的公众号: 每日精选算法题, 欢迎大家扫码关注~😊
转载地址:https://blog.csdn.net/zjulyx1993/article/details/107110429 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月03日 08时57分59秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
lili‘s sqli-labs LESS-3&LESS-4
2021-07-02
lili‘s LESS05前知识补充
2021-07-02
lili’s LESS05盲注!!(小猪崽觉得这是个什么玩意儿嘤嘤嘤)
2021-07-02
lili‘s sqli-labs LESS06
2021-07-02
lili’s sqli-labs LESS7,8,9,10 补充知识
2021-07-02
第一天收获
2021-07-02
第一周:Centos 7 基础命令
2021-07-02
centos 7 用户创建、用户/文件权限管理
2021-07-02
文本处理(grep、sed)、正则表达式、vim基础
2021-07-02
find 命令特点及用法
2021-07-02
python实例018--验证爬下来的代理ip是否可用,去掉不可用的代理
2021-07-02
python实例019--爬取网站时的图片
2021-07-02
python实例020--爬取图片网站上的原图作为壁纸
2021-07-02
python实例021--利用python判断一个数是奇数还是偶数
2021-07-02
调试安卓程序时,启动Activity时卡住的原因之一
2021-07-02
来点基础的东西,关于浮点数的大小端转换以及浮点数的格式解析
2021-07-02
Kconfig的两种用法
2021-07-02
华大HC32-(04)-微秒级us延时测试
2021-07-02
华大HC32-(05)-定时器输入捕获
2021-07-02
Source Insight-设置相对路径
2021-07-02