题目 #
Implement the myAtoi(string s) function, which converts a string to a 32-bit signed integer (similar to C/C++’s atoi function).
The algorithm for myAtoi(string s) is as follows:
- Read in and ignore any leading whitespace.
- Check if the next character (if not already at the end of the string) is ‘-’ or ‘+’. Read this character in if it is either. This determines if the final result is negative or positive respectively. Assume the result is positive if neither is present.
- Read in next the characters until the next non-digit character or the end of the input is reached. The rest of the string is ignored.
- Convert these digits into an integer (i.e. “123” -> 123, “0032” -> 32). If no digits were read, then the integer is 0. Change the sign as necessary (from step 2).
- If the integer is out of the 32-bit signed integer range $[-2^{31}, 2^{31} - 1]$, then clamp the integer so that it remains in the range. Specifically, integers less than $-2^{31}$ should be clamped to $-2^{31}$, and integers greater than $2^{31} - 1$ should be clamped to $2^{31} - 1$.
- Return the integer as the final result.
Note:
- Only the space character ’ ’ is considered a whitespace character.
- Do not ignore any characters other than the leading whitespace or the rest of the string after the digits.
思路1 #
状态机实现,不详细解释
由于没有限制64位,直接用64位判断溢出
1func myAtoi(s string) int {
2 var result int64
3 sign := 1
4 isParse := false
5 for _, v := range s {
6 if v <= '9' && v >= '0' {
7 if !isParse {
8 result = int64(v - '0')
9 isParse = true
10 continue
11 }
12 result *= 10
13 result += int64(v - '0')
14 if sign == 1 && result > math.MaxInt32 {
15 return math.MaxInt32
16 } else if result-1 > math.MaxInt32 {
17 return math.MinInt32
18 }
19 continue
20 } else if isParse {
21 break
22 } else if v == '-' {
23 sign = -1
24 isParse = true
25 } else if v == '+' {
26 isParse = true
27 } else if v != ' ' {
28 return 0
29 }
30 }
31 return int(result) * sign
32}