Skip to content

Commit 1198fcc

Browse files
authored
Merge pull request halfrost#150 from ssezhangpeng/master
add leetcode_0065
2 parents 014e437 + cb1a212 commit 1198fcc

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package leetcode
2+
3+
func isNumber(s string) bool {
4+
numFlag, dotFlag, eFlag := false, false, false
5+
6+
for i := 0; i < len(s); i++ {
7+
if '0' <= s[i] && s[i] <= '9' {
8+
numFlag = true
9+
} else if s[i] == '.' && !dotFlag && !eFlag {
10+
dotFlag = true
11+
} else if (s[i] == 'e' || s[i] == 'E') && !eFlag && numFlag {
12+
eFlag = true
13+
numFlag = false // reJudge integer after 'e' or 'E'
14+
} else if (s[i] == '+' || s[i] == '-') && (i == 0 || s[i-1] == 'e' || s[i-1] == 'E') {
15+
continue
16+
} else {
17+
return false
18+
}
19+
}
20+
// avoid case: s == '.' or 'e/E' or '+/-' and etc...
21+
// string s must have num
22+
return numFlag
23+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
func Test_Problem65(t *testing.T) {
9+
10+
tcs := []struct {
11+
s string
12+
ans bool
13+
}{
14+
15+
{
16+
"0",
17+
true,
18+
},
19+
20+
{
21+
"e",
22+
false,
23+
},
24+
25+
{
26+
".",
27+
false,
28+
},
29+
30+
{
31+
".1",
32+
true,
33+
},
34+
}
35+
fmt.Printf("------------------------Leetcode Problem 65------------------------\n")
36+
37+
for _, tc := range tcs {
38+
fmt.Printf("【input】:%v 【output】:%v\n", tc, isNumber(tc.s))
39+
}
40+
fmt.Printf("\n\n\n")
41+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# [65. Valid Number](https://leetcode.com/problems/valid-number/)
2+
3+
4+
## 题目
5+
6+
A **valid number** can be split up into these components (in order):
7+
8+
1. A **decimal number** or an integer.
9+
2. (Optional) An 'e' or 'E', followed by an **integer.**
10+
11+
A **decimal number** can be split up into these components (in order):
12+
13+
1. (Optional) A sign character (either '+' or '-').
14+
2. One of the following formats:
15+
1. One or more digits, followed by a dot '.'.
16+
2. One or more digits, followed by a dot '.', followed by one or more digits.
17+
3. A dot '.', followed by one or more digits.
18+
19+
An **integer** can be split up into these components (in order):
20+
21+
1. (Optional) A sign character (either '+' or '-').
22+
2. One or more digits.
23+
24+
For example, all the following are valid numbers: `["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]`, while the following are not valid numbers: `["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"].`
25+
26+
Given a string s, return true if s is a **valid number.**
27+
28+
**Example:**
29+
30+
Input: s = "0"
31+
Output: true
32+
33+
Input: s = "e"
34+
Output: false
35+
36+
## 题目大意
37+
38+
给定一个字符串S,请根据以上的规则判断该字符串是否是一个有效的数字字符串。
39+
40+
41+
## 解题思路
42+
43+
- 用三个变量分别标记是否出现过数字、是否出现过'.'和 是否出现过 'e/E'
44+
- 从左到右依次遍历字符串中的每一个元素
45+
- 如果是数字,则标记数字出现过
46+
- 如果是 '.', 则需要 '.'没有出现过,并且 'e/E' 没有出现过,才会进行标记
47+
- 如果是 'e/E', 则需要 'e/E'没有出现过,并且前面出现过数字,才会进行标记
48+
- 如果是 '+/-', 则需要是第一个字符,或者前一个字符是 'e/E',才会进行标记,并重置数字出现的标识
49+
- 最后返回时,需要字符串中至少出现过数字,避免下列case: s == '.' or 'e/E' or '+/e' and etc...

0 commit comments

Comments
 (0)