Skip to content

Commit 0bb1d67

Browse files
author
robot
committed
fix: $65
1 parent afc4566 commit 0bb1d67

File tree

1 file changed

+50
-5
lines changed

1 file changed

+50
-5
lines changed

problems/65.valid-number.md

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,28 @@ s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减
7979

8080
### 思路
8181

82-
我们可以使用三个变量:
82+
我们可以直接进行一次遍历,边遍历边判断是否合法。
83+
84+
如果要边遍历边判断是否合法则需要记录一些关键信息。比如,当我遍历途中遇到了 .,那么我实际上需要知道一些信息,比如前面是否已经出现过 . 了。如果已经出现过了,那么就可以得出结论,该数字非法。
85+
86+
除了前面是否出现 . 这样的信息,我们还需要关注其他信息。具体地,我们需要关注:
87+
88+
- .
89+
- e/E
90+
- 前面是否有数字
91+
92+
以上三个信息。 我们可以用三个变量,分别表示上一次遇到其的位置(索引),用 -1 表示还没有遇到。
93+
94+
实际上,这道题的关键点就是分析出哪些是非法,这样不是非法的,那么就是合法的。 之所以如此是因为合法的实在是太多了,我们没有办法一一判断,而只能从非法的角度入手。而非法的情况比较多,如何分类是个问题,这也是本题是困难难度的原因。
95+
96+
让我们来分析一下非法的情景。
97+
98+
- 点前面有 e 或者 点,比如 1.1.1 或者 3e5.2
99+
- e 前面有 e ,比如 e12e。或者 e 前面没有数字,比如 e123
100+
- `+ -` 前面要么是 e,要么其位于第一位
101+
- 出现了非法字符。也就是出现了除了 +-eE 数字. 之外的字符
102+
103+
代码上,我们可以使用三个变量:
83104

84105
1. last_dot 上一次遇到的 . 的位置
85106
2. last_e 上一次遇到的 e/E 的位置
@@ -92,6 +113,10 @@ s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减
92113
- 如果遇到了 +-,要么它是第一个字符,要么它前面是 e/E,否则不能合法
93114
- 其他非数字字符均为不合法
94115

116+
### 关键点
117+
118+
- 分析非法的情况,用三个变量记录上一次出现的点,指数,数字的位置来复制判断
119+
95120
### 代码
96121

97122
```py
@@ -138,6 +163,25 @@ class Solution:
138163

139164
> 和动态规划是类似的
140165
166+
对于这道题来说,打底的状态就是各种字符的类型。即:
167+
168+
- 数字
169+
- .
170+
- eE
171+
- +-
172+
173+
打底就是这四种。
174+
175+
> 我们没有必要将 eE 或者 +- 进行区分,这是因为在这里二者的逻辑不会有差别。
176+
177+
那么这四种就够了。这是不够的。这是因为题目描述决定的。比如题目说了 e 后面不能是小数。 那么对于 . 来说,
178+
179+
- 我们就需要**分裂** 为两种状态: e 前面的 . 和 e 后面的 .。
180+
- 类似地,+- 号,我们需要区分是第一位还是 e 后面的(紧邻),这是因为第一位后面可以跟 . ,而 e 后面紧邻的不可以。
181+
- 数字也是一样。 由于 e 后面不能有点,也需要进行类似的**分裂**
182+
183+
最后一个比较容易漏掉,我们需要一种数字状态,这个数字状态后面只能跟数字,不能跟其他。比如 +2e+3 ,这个时候的 3 后面就只能是数字了,其他都是非法的。
184+
141185
对于这道题来说:
142186

143187
- 图中黄色的四个部分就是选择。由于 +-,以及 [1-9] 对我们的算法没有影响,因此没有单独抽离出来,而是将其归为一类。
@@ -149,16 +193,17 @@ class Solution:
149193
150194
另外由于:dot 前面和后面必须有至少一个数字,并且有没有数字对选择也有影响,因此我们也需要对此区分。我这里用 dot1 表示前面有数字的 dot,dot2 表示前面没有数字的 dot
151195

152-
关于如何转化,我就不一一分析了,大家直接看代码吧。
153-
154-
虽然思路不难理解,但是细节还是蛮多的,大家自己写写就知道了。
196+
关于如何转化,我就不一一分析了,大家直接看代码吧。虽然思路不难理解,但是细节还是蛮多的,大家自己写写就知道了。
155197

156198
### 关键点
157199

158200
- 建立状态机模型
201+
- 如果知道一共有多少状态
159202

160203
### 代码
161204

205+
代码上,我们 xxx1 表示前面的 xxx,xxx2 表示后面的 xxx。D 表示只能跟数字
206+
162207
- 语言支持:Python3
163208

164209
Python3 Code:
@@ -200,7 +245,7 @@ class Solution:
200245
令 n 为数组长度。
201246

202247
- 时间复杂度:$O(n)$
203-
- 空间复杂度:$O(1)$
248+
- 空间复杂度:虽然使用了 states 存放状态,但是其不会随着数字增大而变大,而是一个定值,因此空间复杂度为 $O(1)$
204249

205250
> 此题解由 [力扣刷题插件](https://leetcode-pp.github.io/leetcode-cheat/?tab=solution-template) 自动生成。
206251

0 commit comments

Comments
 (0)