Skip to content

Commit 14a4f8e

Browse files
committed
feat: add python and java solutions to lcof question
添加《剑指 Offer》题解:面试题20. 表示数值的字符串
1 parent 318888c commit 14a4f8e

File tree

3 files changed

+120
-2
lines changed

3 files changed

+120
-2
lines changed

lcof/面试题20. 表示数值的字符串/README.md

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,80 @@
88

99
## 解法
1010
<!-- 这里可写通用的实现逻辑 -->
11+
遍历字符串:
1112

13+
- 出现 `+`/`-` 时,位置必须是在第 0 位,或者 `e`/`E` 的后面一位
14+
- 出现 `.` 时,在此之前不能出现 `.` 或者 `e`/`E`
15+
- 出现 `e`/`E` 时,前面不能出现 `e`/`E`,并且必须出现过数字
1216

1317
### Python3
1418
<!-- 这里可写当前语言的特殊实现逻辑 -->
1519

1620
```python
17-
21+
class Solution:
22+
def isNumber(self, s: str) -> bool:
23+
if not s or not s.strip():
24+
return False
25+
s = s.strip()
26+
find_num = find_dot = find_e = False
27+
for i in range(len(s)):
28+
if s[i] == '+' or s[i] == '-':
29+
if i != 0 and s[i - 1] != 'e' and s[i - 1] != 'E':
30+
return False
31+
elif s[i] >= '0' and s[i] <= '9':
32+
find_num = True
33+
elif s[i] == '.':
34+
if find_dot or find_e:
35+
return False
36+
find_dot = True
37+
elif s[i] == 'e' or s[i] == 'E':
38+
if not find_num or find_e:
39+
return False
40+
find_e = True
41+
find_num = False
42+
else:
43+
return False
44+
return find_num
1845
```
1946

2047
### Java
2148
<!-- 这里可写当前语言的特殊实现逻辑 -->
2249

2350
```java
24-
51+
class Solution {
52+
public boolean isNumber(String s) {
53+
if (s == null || s.trim().length() == 0) {
54+
return false;
55+
}
56+
char[] chars = s.trim().toCharArray();
57+
boolean findNum = false;
58+
boolean findE = false;
59+
boolean findDot = false;
60+
for (int i = 0, n = chars.length; i < n; ++i) {
61+
if (chars[i] == '+' || chars[i] == '-') {
62+
if (i != 0 && chars[i - 1] != 'e' && chars[i - 1] != 'E') {
63+
return false;
64+
}
65+
} else if (chars[i] >= '0' && chars[i] <= '9') {
66+
findNum = true;
67+
} else if (chars[i] == '.') {
68+
if (findDot || findE) {
69+
return false;
70+
}
71+
findDot = true;
72+
} else if (chars[i] == 'e' || chars[i] == 'E') {
73+
if (findE || !findNum) {
74+
return false;
75+
}
76+
findE = true;
77+
findNum = false; // 确保e之后也出现数
78+
} else {
79+
return false;
80+
}
81+
}
82+
return findNum;
83+
}
84+
}
2585
```
2686

2787
### ...
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution {
2+
public boolean isNumber(String s) {
3+
if (s == null || s.trim().length() == 0) {
4+
return false;
5+
}
6+
char[] chars = s.trim().toCharArray();
7+
boolean findNum = false;
8+
boolean findE = false;
9+
boolean findDot = false;
10+
for (int i = 0, n = chars.length; i < n; ++i) {
11+
if (chars[i] == '+' || chars[i] == '-') {
12+
if (i != 0 && chars[i - 1] != 'e' && chars[i - 1] != 'E') {
13+
return false;
14+
}
15+
} else if (chars[i] >= '0' && chars[i] <= '9') {
16+
findNum = true;
17+
} else if (chars[i] == '.') {
18+
if (findDot || findE) {
19+
return false;
20+
}
21+
findDot = true;
22+
} else if (chars[i] == 'e' || chars[i] == 'E') {
23+
if (findE || !findNum) {
24+
return false;
25+
}
26+
findE = true;
27+
findNum = false; // 确保e之后也出现数
28+
} else {
29+
return false;
30+
}
31+
}
32+
return findNum;
33+
}
34+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution:
2+
def isNumber(self, s: str) -> bool:
3+
if not s or not s.strip():
4+
return False
5+
s = s.strip()
6+
find_num = find_dot = find_e = False
7+
for i in range(len(s)):
8+
if s[i] == '+' or s[i] == '-':
9+
if i != 0 and s[i - 1] != 'e' and s[i - 1] != 'E':
10+
return False
11+
elif s[i] >= '0' and s[i] <= '9':
12+
find_num = True
13+
elif s[i] == '.':
14+
if find_dot or find_e:
15+
return False
16+
find_dot = True
17+
elif s[i] == 'e' or s[i] == 'E':
18+
if not find_num or find_e:
19+
return False
20+
find_e = True
21+
find_num = False
22+
else:
23+
return False
24+
return find_num

0 commit comments

Comments
 (0)