这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战
推荐阅读
大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。
一、题目
1、算法题目
“给定一个字符串,判断是否是有效数字。”
题目链接:
来源:力扣(LeetCode)
链接:65. 有效数字 - 力扣(LeetCode) (leetcode-cn.com)
2、题目描述
有效数字(按顺序)可以分成以下几个部分:
- 1.一个 小数 或者 整数
- 2.(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(’+’ 或 ‘-‘)
下述格式之一:
- 1.至少一位数字,后面跟着一个点 ‘.’
- 2.至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
- 3.一个点 ‘.’ ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(’+’ 或 ‘-‘)
至少一位数字
部分有效数字列举如下:
- [“2”, “0089”, “-0.1”, “+3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e+7”, “+6e-1”, “53.5e93”, “-123.456e789”]
部分无效数字列举如下: - [“abc”, “1a”, “1e”, “e3”, “99e2.5”, “–6”, “-+3”, “95a54e53”]
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。
1 | ini复制代码示例 1: |
1 | ini复制代码示例 2: |
二、解题
1、思路分析
这道题可以使用有限状态机的思路解决问题,有限状态机是一种计算模型,包含一系列的状态,然后根据不同的状态进行切换。
然后,就按顺序去读取字符串中的每一个字符,如果是实现约定好的庄毅规则,就从当前状态转移到下一个状态,状态转移完成后,就读取下一个字符。
当所有的字符串读取完毕,如果状态机处于正确状态就说明该字符串正确,否则,不正确。
2、代码实现
代码参考:
1 | csharp复制代码public class Solution { |
3、时间复杂度
时间复杂度 : O(n)
其中n是数组的长度,只需要遍历一遍数组即可求得答案。
空间复杂度: O(1)
只需要常数级别的空间存放变量。
三、总结
当然这道题有更加简便的方法解决。
就是用正则表达式匹配:
1 | arduino复制代码class Solution { |
但是要注意,c++ 用正则表达式记得作为类的静态变量或全局变量,避免重复构造的开销,否则会超时。
本文转载自: 掘金