Implement atoi which converts a string to an integer.
就是字符串转换为数字,但是还是有一些特殊的规则,具体看题目描述页
解法
解法1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| func myAtoi(str string) int {
if len(str) == 0 {
return 0
}
result := 0
u := -1 //有无符号
e := -1 //错误位第几位
for n, v := range str {
if v < 48 || v > 57 {
if v == 43 || v == 45 { //+-号
if result != 0 {
e = n
break
}
if u >= 0 {
return 0
}
u = n
continue
}
if v == 32 { //空格
if result != 0 {
e = n
break
}
if u >= 0 { //这里默认符号之后只能跟数字
return 0
}
continue
}
e = n
break
}
result += int(v-48) * int(math.Pow(10, float64(len(str)-n-1)))
}
if e >= 0 {
result /= int(math.Pow(10, float64(len(str)-e)))
}
if u >= 0 {
if str[u] == 45 {
result = -result
}
}
if result > math.MaxInt32 {
if u >= 0 {
if str[u] == 45 {
return math.MinInt32
}
}
result = math.MaxInt32
}
if result < math.MinInt32 {
if u < 0 {
return math.MaxInt32
} else {
if str[u] != 45 {
return math.MaxInt32
}
}
result = math.MinInt32
}
return result
}
|
解法2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| func myAtoi2(str string) int {
//empty string
if len(str) == 0 {
return 0
}
index, sign, result := 0, 1, 0
//remove space
for i := 0; i < len(str); i++ {
if str[i] == ' ' {
index++
} else {
break
}
}
//handle sign
if str[index] == '+' || str[index] == '-' {
if str[index] == '-' {
sign = -1
}
index++
}
//Convert number and avoid overflow
for i := index; i < len(str); i++ {
digit := int(str[i] - '0')
if digit < 0 || digit > 9 {
break
}
if sign == 1 {
if math.MaxInt32/10 == result || math.MaxInt32/10 < result && math.MaxInt32%10 < digit {
return math.MaxInt32
}
} else {
if (math.MaxInt32/10 == result || math.MaxInt32/10 < result) && digit > 8 {
return math.MinInt32
}
}
result = result*10 + digit
index++
}
return result * sign
}
|
总结
- 解法1里面,我用了acsii码来判断。但是这里用acsii码来判断好像有些多余,因为还是有很多特殊情况需要单独处理
- 解法2简化了一些步骤,但是对题目里面的一些特殊情况还是没有办法避免的