Skip to content

Commit a2826d4

Browse files
committed
feat: add solutions to lc problem: No.0065
No.0065.Valid Number
1 parent dae8198 commit a2826d4

File tree

7 files changed

+436
-50
lines changed

7 files changed

+436
-50
lines changed

solution/0000-0099/0065.Valid Number/README.md

+166-1
Original file line numberDiff line numberDiff line change
@@ -75,22 +75,187 @@
7575

7676
<!-- 这里可写通用的实现逻辑 -->
7777

78+
**方法一:分情况讨论**
79+
80+
首先,我们判断字符串是否以正负号开头,如果是,将指针 $i$ 向后移动一位。如果此时指针 $i$ 已经到达字符串末尾,说明字符串只有一个正负号,返回 `false`
81+
82+
如果当前指针 $i$ 指向的字符是小数点,并且小数点后面没有数字,或者小数点后是一个 `e``E`,返回 `false`
83+
84+
接着,我们用两个变量 $dot$ 和 $e$ 分别记录小数点和 `e``E` 的个数。
85+
86+
用指针 $j$ 指向当前字符:
87+
88+
- 如果当前字符是小数点,并且此前出现过小数点或者 `e``E`,返回 `false`。否则,我们将 $dot$ 加一;
89+
- 如果当前字符是 `e``E`,并且此前出现过 `e``E`,或者当前字符是开头或结尾,返回 `false`。否则,我们将 $e$ 加一;然后判断下一个字符是否是正负号,如果是,将指针 $j$ 向后移动一位。如果此时指针 $j$ 已经到达字符串末尾,返回 `false`
90+
- 如果当前字符不是数字,返回 `false`
91+
92+
遍历完字符串后,返回 `true`
93+
94+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为字符串长度。
95+
7896
<!-- tabs:start -->
7997

8098
### **Python3**
8199

82100
<!-- 这里可写当前语言的特殊实现逻辑 -->
83101

84102
```python
85-
103+
class Solution:
104+
def isNumber(self, s: str) -> bool:
105+
n = len(s)
106+
i = 0
107+
if s[i] in '+-':
108+
i += 1
109+
if i == n:
110+
return False
111+
if s[i] == '.' and (i + 1 == n or s[i + 1] in 'eE'):
112+
return False
113+
dot = e = 0
114+
j = i
115+
while j < n:
116+
if s[j] == '.':
117+
if e or dot:
118+
return False
119+
dot += 1
120+
elif s[j] in 'eE':
121+
if e or j == i or j == n - 1:
122+
return False
123+
e += 1
124+
if s[j + 1] in '+-':
125+
j += 1
126+
if j == n - 1:
127+
return False
128+
elif not s[j].isnumeric():
129+
return False
130+
j += 1
131+
return True
86132
```
87133

88134
### **Java**
89135

90136
<!-- 这里可写当前语言的特殊实现逻辑 -->
91137

92138
```java
139+
class Solution {
140+
public boolean isNumber(String s) {
141+
int n = s.length();
142+
int i = 0;
143+
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
144+
++i;
145+
}
146+
if (i == n) {
147+
return false;
148+
}
149+
if (s.charAt(i) == '.' && (i + 1 == n || s.charAt(i + 1) == 'e' || s.charAt(i + 1) == 'E')) {
150+
return false;
151+
}
152+
int dot = 0, e = 0;
153+
for (int j = i; j < n; ++j) {
154+
if (s.charAt(j) == '.') {
155+
if (e > 0 || dot > 0) {
156+
return false;
157+
}
158+
++dot;
159+
} else if (s.charAt(j) == 'e' || s.charAt(j) == 'E') {
160+
if (e > 0 || j == i || j == n - 1) {
161+
return false;
162+
}
163+
++e;
164+
if (s.charAt(j + 1) == '+' || s.charAt(j + 1) == '-') {
165+
if (++j == n - 1) {
166+
return false;
167+
}
168+
}
169+
} else if (s.charAt(j) < '0' || s.charAt(j) > '9') {
170+
return false;
171+
}
172+
}
173+
return true;
174+
}
175+
}
176+
```
177+
178+
### **C++**
179+
180+
```cpp
181+
class Solution {
182+
public:
183+
bool isNumber(string s) {
184+
int n = s.size();
185+
int i = 0;
186+
if (s[i] == '+' || s[i] == '-') ++i;
187+
if (i == n) return false;
188+
if (s[i] == '.' && (i + 1 == n || s[i + 1] == 'e' || s[i + 1] == 'E')) return false;
189+
int dot = 0, e = 0;
190+
for (int j = i; j < n; ++j) {
191+
if (s[j] == '.') {
192+
if (e || dot) return false;
193+
++dot;
194+
} else if (s[j] == 'e' || s[j] == 'E') {
195+
if (e || j == i || j == n - 1) return false;
196+
++e;
197+
if (s[j + 1] == '+' || s[j + 1] == '-') {
198+
if (++j == n - 1) return false;
199+
}
200+
} else if (s[j] < '0' || s[j] > '9') return false;
201+
}
202+
return true;
203+
}
204+
};
205+
```
206+
207+
### **Go**
208+
209+
```go
210+
func isNumber(s string) bool {
211+
i, n := 0, len(s)
212+
if s[i] == '+' || s[i] == '-' {
213+
i++
214+
}
215+
if i == n {
216+
return false
217+
}
218+
if s[i] == '.' && (i+1 == n || s[i+1] == 'e' || s[i+1] == 'E') {
219+
return false
220+
}
221+
var dot, e int
222+
for j := i; j < n; j++ {
223+
if s[j] == '.' {
224+
if e > 0 || dot > 0 {
225+
return false
226+
}
227+
dot++
228+
} else if s[j] == 'e' || s[j] == 'E' {
229+
if e > 0 || j == i || j == n-1 {
230+
return false
231+
}
232+
e++
233+
if s[j+1] == '+' || s[j+1] == '-' {
234+
j++
235+
if j == n-1 {
236+
return false
237+
}
238+
}
239+
} else if s[j] < '0' || s[j] > '9' {
240+
return false
241+
}
242+
}
243+
return true
244+
}
245+
```
246+
247+
### **C#**
248+
249+
```cs
250+
using System.Text.RegularExpressions;
251+
252+
public class Solution {
253+
private readonly Regex _isNumber_Regex = new Regex(@"^\s*[+-]?(\d+(\.\d*)?|\.\d+)([Ee][+-]?\d+)?\s*$");
93254

255+
public bool IsNumber(string s) {
256+
return _isNumber_Regex.IsMatch(s);
257+
}
258+
}
94259
```
95260

96261
### **...**

solution/0000-0099/0065.Valid Number/README_EN.md

+148-1
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,160 @@
7272
### **Python3**
7373

7474
```python
75-
75+
class Solution:
76+
def isNumber(self, s: str) -> bool:
77+
n = len(s)
78+
i = 0
79+
if s[i] in '+-':
80+
i += 1
81+
if i == n:
82+
return False
83+
if s[i] == '.' and (i + 1 == n or s[i + 1] in 'eE'):
84+
return False
85+
dot = e = 0
86+
j = i
87+
while j < n:
88+
if s[j] == '.':
89+
if e or dot:
90+
return False
91+
dot += 1
92+
elif s[j] in 'eE':
93+
if e or j == i or j == n - 1:
94+
return False
95+
e += 1
96+
if s[j + 1] in '+-':
97+
j += 1
98+
if j == n - 1:
99+
return False
100+
elif not s[j].isnumeric():
101+
return False
102+
j += 1
103+
return True
76104
```
77105

78106
### **Java**
79107

80108
```java
109+
class Solution {
110+
public boolean isNumber(String s) {
111+
int n = s.length();
112+
int i = 0;
113+
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
114+
++i;
115+
}
116+
if (i == n) {
117+
return false;
118+
}
119+
if (s.charAt(i) == '.' && (i + 1 == n || s.charAt(i + 1) == 'e' || s.charAt(i + 1) == 'E')) {
120+
return false;
121+
}
122+
int dot = 0, e = 0;
123+
for (int j = i; j < n; ++j) {
124+
if (s.charAt(j) == '.') {
125+
if (e > 0 || dot > 0) {
126+
return false;
127+
}
128+
++dot;
129+
} else if (s.charAt(j) == 'e' || s.charAt(j) == 'E') {
130+
if (e > 0 || j == i || j == n - 1) {
131+
return false;
132+
}
133+
++e;
134+
if (s.charAt(j + 1) == '+' || s.charAt(j + 1) == '-') {
135+
if (++j == n - 1) {
136+
return false;
137+
}
138+
}
139+
} else if (s.charAt(j) < '0' || s.charAt(j) > '9') {
140+
return false;
141+
}
142+
}
143+
return true;
144+
}
145+
}
146+
```
147+
148+
### **C++**
149+
150+
```cpp
151+
class Solution {
152+
public:
153+
bool isNumber(string s) {
154+
int n = s.size();
155+
int i = 0;
156+
if (s[i] == '+' || s[i] == '-') ++i;
157+
if (i == n) return false;
158+
if (s[i] == '.' && (i + 1 == n || s[i + 1] == 'e' || s[i + 1] == 'E')) return false;
159+
int dot = 0, e = 0;
160+
for (int j = i; j < n; ++j) {
161+
if (s[j] == '.') {
162+
if (e || dot) return false;
163+
++dot;
164+
} else if (s[j] == 'e' || s[j] == 'E') {
165+
if (e || j == i || j == n - 1) return false;
166+
++e;
167+
if (s[j + 1] == '+' || s[j + 1] == '-') {
168+
if (++j == n - 1) return false;
169+
}
170+
} else if (s[j] < '0' || s[j] > '9') return false;
171+
}
172+
return true;
173+
}
174+
};
175+
```
176+
177+
### **Go**
178+
179+
```go
180+
func isNumber(s string) bool {
181+
i, n := 0, len(s)
182+
if s[i] == '+' || s[i] == '-' {
183+
i++
184+
}
185+
if i == n {
186+
return false
187+
}
188+
if s[i] == '.' && (i+1 == n || s[i+1] == 'e' || s[i+1] == 'E') {
189+
return false
190+
}
191+
var dot, e int
192+
for j := i; j < n; j++ {
193+
if s[j] == '.' {
194+
if e > 0 || dot > 0 {
195+
return false
196+
}
197+
dot++
198+
} else if s[j] == 'e' || s[j] == 'E' {
199+
if e > 0 || j == i || j == n-1 {
200+
return false
201+
}
202+
e++
203+
if s[j+1] == '+' || s[j+1] == '-' {
204+
j++
205+
if j == n-1 {
206+
return false
207+
}
208+
}
209+
} else if s[j] < '0' || s[j] > '9' {
210+
return false
211+
}
212+
}
213+
return true
214+
}
215+
```
216+
217+
### **C#**
218+
219+
```cs
220+
using System.Text.RegularExpressions;
221+
222+
public class Solution {
223+
private readonly Regex _isNumber_Regex = new Regex(@"^\s*[+-]?(\d+(\.\d*)?|\.\d+)([Ee][+-]?\d+)?\s*$");
81224

225+
public bool IsNumber(string s) {
226+
return _isNumber_Regex.IsMatch(s);
227+
}
228+
}
82229
```
83230

84231
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
public:
3+
bool isNumber(string s) {
4+
int n = s.size();
5+
int i = 0;
6+
if (s[i] == '+' || s[i] == '-') ++i;
7+
if (i == n) return false;
8+
if (s[i] == '.' && (i + 1 == n || s[i + 1] == 'e' || s[i + 1] == 'E')) return false;
9+
int dot = 0, e = 0;
10+
for (int j = i; j < n; ++j) {
11+
if (s[j] == '.') {
12+
if (e || dot) return false;
13+
++dot;
14+
} else if (s[j] == 'e' || s[j] == 'E') {
15+
if (e || j == i || j == n - 1) return false;
16+
++e;
17+
if (s[j + 1] == '+' || s[j + 1] == '-') {
18+
if (++j == n - 1) return false;
19+
}
20+
} else if (s[j] < '0' || s[j] > '9') return false;
21+
}
22+
return true;
23+
}
24+
};
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
// https://leetcode.com/problems/valid-number/
1+
using System.Text.RegularExpressions;
22

3-
using System.Text.RegularExpressions;
4-
5-
public partial class Solution
6-
{
3+
public class Solution {
74
private readonly Regex _isNumber_Regex = new Regex(@"^\s*[+-]?(\d+(\.\d*)?|\.\d+)([Ee][+-]?\d+)?\s*$");
8-
public bool IsNumber(string s)
9-
{
5+
6+
public bool IsNumber(string s) {
107
return _isNumber_Regex.IsMatch(s);
118
}
129
}

0 commit comments

Comments
 (0)